2016-03-15 47 views
-1

我制作了一个太空侵略者游戏,并且出于同样的原因它不断崩溃。 有一个“错误”,在它的代码是:应用程序在随机时刻不断崩溃Swift

if (firstBody.categoryBitMask & missileCategory) != 0 && 
     (secondBody.categoryBitMask & alienCategory) != 0 { 
      destroyAlien(firstBody.node as! SKSpriteNode, alien: secondBody.node as! SKSpriteNode) 

    } 
} 

和碰撞吸能的错误是:

致命错误:意外发现零而展开的可选值

+0

所以无论'firstBody.node'为零,或者'secondBody.node'为零,并且你的武力解开它们导致崩溃。 – Michael

+0

当您使用'!'和'as!'时,如果值为_nil_,您的应用程序可能会崩溃。尝试用'?'替换所有'!'并让你的应用程序以这种方式进行编译。 – nielsbot

+0

我该如何强制拆包呢? @Michael –

回答

0

您目前力 - 使用as!包装firstBody.nodesecondBody.node。如果其中任何一个都是零,你的应用程序将崩溃。您应该更改destroyAlien以采用可选参数,然后使用as?

func destroyAlien(node1: SKSpriteNode?, alien node2: SKSpriteNode?) { 
    if let node1 = node1 { 
     // node1 not nil 
    } 
    if let node2 = node2 { 
     // node2 not nil 
    } 
} 

那么你的代码变成:

if (firstBody.categoryBitMask & missileCategory) != 0 && 
     (secondBody.categoryBitMask & alienCategory) != 0 { 
      destroyAlien(firstBody.node as? SKSpriteNode, alien: secondBody.node as? SKSpriteNode) 
    } 
} 

这是假设你想允许一个或两个是零。如果两者都不应该是零,那么在代码中就有一个逻辑错误。