swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称
Posted
技术标签:
【中文标题】swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称【英文标题】:swift 2 fatal error: unexpectedly found nil while unwrapping an Optional value - Category Name 【发布时间】:2016-07-19 21:36:31 【问题描述】:我在以下代码中不断收到“致命错误:在展开可选值时意外发现 nil”
let ballCategoryName = "ball"
class GameScene: SKScene, SKPhysicsContactDelegate
override func didMoveToView(view: SKView)
let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
borderBody.friction = 0
self.physicsBody = borderBody
let ball = childNodeWithName(ballCategoryName) as! SKSpriteNode
ball.position = CGPointMake(self.size.width / 2, self.size.height / 2)
ball.physicsBody?.dynamic = true
ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height / 2)
ball.physicsBody!.applyImpulse(CGVector(dx: 2.0, dy: -2.0))
self.addChild(ball)
错误出现在 “let ball = childNodeWithName(ballCategoryName) as!SKSpriteNode” 想知道是否有人可以帮助我了解为什么会出现这种情况
【问题讨论】:
不知道你在这里问什么。显然你传入的ballCategoryName
没有子节点?
@hnh 我是这种代码的新手,所以我有点困惑。添加childNode需要做什么?抱歉,如果这听起来很愚蠢
不看 childNodeWithName,真的很难判断出了什么问题。
What does "fatal error: unexpectedly found nil while unwrapping an Optional value" mean?的可能重复
【参考方案1】:
您必须将该球创建为节点。你可以像这样制作一个节点:
让球 = SKSpriteNode(imageNamed: "fileimage.png")
然后将其添加到场景中。
问题是你从无到有创造了那个球。 如果您尚未创建该场景,您将不会在下面找到任何内容。那个孩子不存在。
childNodeWithName(ballCategoryName) as! SKSpriteNode
【讨论】:
【参考方案2】:问题是你在这条线上强制转换不安全:
let ball = childNodeWithName(ballCategoryName) as! SKSpriteNode
childNodeWithName()
方法返回 sprite kit 节点或 nil (SKSpriteNode?
)。感叹号:as! SKSpriteNode
表示您确定此返回不为零,并且您想将其转换为非可选的SKSpriteNode
。您似乎遇到了 childNodeWithName(..
返回 nil 的情况,因此强制转换失败并且您的应用程序崩溃了。
您可以通过多种方式打开可选项,例如,如果您使用if let
,您的代码将如下所示:
if let ball = childNodeWithName(ballCategoryName)
ball.position = CGPointMake(self.size.width / 2, self.size.height / 2)
ball.physicsBody?.dynamic = true
ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height / 2)
ball.physicsBody!.applyImpulse(CGVector(dx: 2.0, dy: -2.0))
self.addChild(ball)
请注意,在此示例中,如果 childNodeWithName(ballCategoryName)
返回 nil,则 if 子句主体中的代码根本不会运行。
请参阅apple docs 以获得关于您可能解开可选值的所有方式的非常全面的说明。
或者,正如其他答案所表明的那样,您可以使用let ball = SKSpriteNode(imageNamed: "something.png")
将球实例化为 SKSpriteNode 的非可选实例
【讨论】:
【参考方案3】:你应该替换这个
let ball = childNodeWithName(ballCategoryName) as! SKSpriteNode
有了这个
let ball = SKSpriteNode(imageNamed: "YOUR_IMAGE_NAME")
我还建议你阅读SpriteKit Programming Guide。
【讨论】:
以上是关于swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称的主要内容,如果未能解决你的问题,请参考以下文章
Swift 1.2:致命错误:在展开可选值时意外发现 nil
Swift 和 UILabel - 致命错误:在展开可选值时意外发现 nil
(Swift) PrepareForSegue: 致命错误: 在展开可选值时意外发现 nil