SKPhysicsBody.node时的Swift ClassCastException - > SKLabelNode。为什么?

时间:2014-10-11 15:57:36

标签: swift classcastexception

以下代码导致类强制转换异常。有人能解释我为什么吗?

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; "斯威夫特动态演员失败" 0x1046689ba:movq%rax,0x87427(%rip); gCRAnnotations + 8 0x1046689c1:int3
0x1046689c2:nopw%cs:(%rax,%rax)

1 个答案:

答案 0 :(得分:1)

您不知道哪个正文在您的联系人处理程序中 - 对于任何给定的联系人,SpriteKit会以任意顺序标记两个正文bodyAbodyB。即使设置了接触位掩码,以便所有碰撞都在精灵和标签之间,bodyA可能是一次碰撞时的精灵和另一次碰撞上的标签。

您的联系处理人员应对此负责。在切换到需要知道每种类型的代码之前,检查可能的主体顺序。您可以通过使用as?进行条件转换或(在更多种类的碰撞的游戏中更常用)检查每个正文的categoryBitMask来执行此操作。