Swift 当SKPhysicsBody.node->;SKLabelNode。为什么?

Swift 当SKPhysicsBody.node->;SKLabelNode。为什么?,swift,classcastexception,Swift,Classcastexception,以下代码导致类强制转换异常。有人能解释一下为什么吗 var firstBody: SKPhysicsBody var secondBody: SKPhysicsBody firstBody = contact.bodyA secondBody = contact.bodyB projectileDidCollide(firstBody.node as SKSpriteNode, flyingLabel: secondBody.node as SKLabelNode) 导致ClassCastEx

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

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;“Iskindof类:” 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_DynamicCastobJClass+51 0x1046689ac:addq$0x8,%rsp 0x1046689b0:popq%rbx 0x1046689b1:popq%rbp 0x1046689b2:retq
0x1046689b3:leaq 0xc158(%rip),%rax;“Swift动态强制转换失败” 0x1046689ba:movq%rax,0x87427(%rip);gCRAnnotations+8 0x1046689c1:int3

0x1046689c2:nopw%cs:(%rax,%rax)

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


您的联系人处理程序应该对此负责。在交给需要知道每种类型的代码之前,检查主体的可能顺序。您可以通过使用
as?
或(在具有更多碰撞类型的游戏中更普遍地有用)检查每个主体的
categoryBitMask
来执行条件强制转换

您没有将
firstBody
secondBody
设置为任何内容。为什么需要将
firstBody.node
secondBody.node
分别强制转换为SKSpriteNote和SKLabelNode?我正在用另一种方法进行附加处理,例如:sparket.removeFromParent()flyingLabel.removeFromParent()无法保证节点在碰撞委托方法中的顺序(假设是这样)
firstBody.node
可能是
SKLabelNode
secondBody.node
可能是排序它的
SKSpriteNode
。非常感谢。这就解决了。非常感谢。