2016-03-15 85 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) 
    } 
} 

這是假設你想允許一個或兩個是零。如果兩者都不應該是零,那麼在代碼中就有一個邏輯錯誤。