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

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_dynamicCastObjCClass无条件的:
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_dynamicCastObjCClass无条件+ 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_dynamicCastObjCClass无条件+ 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)

最佳答案

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

您的联系人处理程序应对此负责。在移交给需要了解每个主体类型的代码之前,请检查主体的任何可能顺序。您可以通过as?进行有条件的强制转换,或者(检查在更多类型的碰撞中更有用的游戏)检查每个物体的categoryBitMask来进行此操作。

07-24 14:17