2014-10-11 37 views
0

以下代碼導致類轉換異常。有人能解釋我爲什麼嗎?我很喜歡斯威夫特這樣對我裸露。Swift ClassCastException當SKPhysicsBody.node - > SKLabelNode。爲什麼?

var firstBody: SKPhysicsBody 
var secondBody: SKPhysicsBody 
firstBody = contact.bodyA 
secondBody = contact.bodyB 
projectileDidCollide(firstBody.node as SKSpriteNode, flyingLabel: secondBody.node as SKLabelNode) 

導致ClassCastException異常:

libswiftCore.dylib`swift_dynamicCastObjCClassUnconditional: 0x104668980:pushq%RBP 0x104668981:MOVQ%RSP,%RBP 0x104668984:pushq%RBX 0x104668985:pushq%RAX 0x104668986 :MOVQ%RSI,%RCX 0x104668989:MOVQ%RDI,%RBX 0x10466898c:xorl%eax中,%eax中 0x10466898e:testq%RBX,%RBX 0x104668991:JE 0x1046689ac; swift_dynamicCastObjCClassUnconditional + 44 0x104668993:movq 0x7f236(%rip),%rsi; 「isKindOfClass:」 0x10466899a:movq%rbx,%rdi 0x10466899d:movq%rcx,%rdx 0x1046689a0:callq 0x10466b46a;符號存根:objc_msgSend 0x1046689a5:testb%al,%al 0x1046689a7:movq%rbx,%rax 0x1046689aa:je 0x1046689b3; swift_dynamicCastObjCClassUnconditional + 51 0x1046689ac:addq $ 0x8中,%RSP 0x1046689b0:popq%RBX 0x1046689b1:popq%RBP 0x1046689b2:retq
0x1046689b3:leaq 0xc158(%RIP),%RAX; 「Swift dynamic cast failed」 0x1046689ba:movq%rax,0x87427(%rip); gCRAnnotations + 8 0x1046689c1:INT3
0x1046689c2:nopw%CS:(RAX%,%RAX)

+1

你還沒有設置'firstBody'和'secondBody'爲任何東西。爲什麼你需要將'firstBody.node'和'secondBody.node'分別轉換爲SKSpriteNote和SKLabelNode? – DrOverbuild 2014-10-11 16:07:25

+0

我正在使用另一種方法進行額外處理,例如:projectile.removeFromParent() flyingLabel.removeFromParent() – user3673836 2014-10-11 16:47:46

+0

不能保證在碰撞委託方法中的節點將按順序排列(假設這是其中的原因)。 'firstBody.node'可能是'SKLabelNode','secondBody.node'可能是'SKSpriteNode'。 – 2014-10-11 17:26:23

回答

1

你不知道哪個機構是在您的聯繫人處理器 - 對於任何給定的接觸,SpriteKit標籤的兩個機構bodyAbodyB以任意順序。即使您的聯繫位掩碼設置爲使所有衝突位於精靈和標籤之間,但是bodyA可能是一次衝突時的精靈,另一次是標籤。

您的聯繫人處理程序應對此進行解釋。在切換到需要知道每個類型的代碼之前,檢查可能的主體順序。您可以通過as?進行有條件鑄造或者(通常在更多類型的碰撞遊戲中有用)來檢查每個物體的categoryBitMask

+0

將其整理出來。謝謝! – user3673836 2014-10-11 17:54:38

相關問題