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:致命错误:在展开可选值时意外发现 nil

Swift 1.2:致命错误:在展开可选值时意外发现 nil

Swift 和 UILabel - 致命错误:在展开可选值时意外发现 nil

(Swift) PrepareForSegue: 致命错误: 在展开可选值时意外发现 nil

Swift 错误 - 致命错误:在展开可选值时意外发现 nil [重复]

SWIFT - 致命错误:在展开可选值时意外发现 nil