当 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)

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:测试q%rbx,%rbx 0x104668991:je 0x1046689ac; swift_dynamicCastObjCClassUnconditional + 44 0x104668993: movq 0x7f236(%rip), %rsi ; “isKindOfClass:” 0x10466899a:movq%rbx,%rdi 0x10466899d:movq%rcx,%rdx 0x1046689a0: 调用 0x10466b46a ;符号 stub :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 动态转换失败” 0x1046689ba: movq %rax, 0x87427(%rip) ; gCR注释 + 8 0x1046689c1:int3
0x1046689c2: nopw %cs:(%rax,%rax)

最佳答案

您不知道联系人处理程序中的哪个主体 - 对于任何给定的联系人,SpriteKit 以任意顺序标记两个主体 bodyAbodyB。即使您的接触位掩码已设置为所有碰撞都发生在 Sprite 和标签之间,bodyA 也可能是一次碰撞中的 Sprite 和另一次碰撞中的标签。

您的联系人处理程序应考虑到这一点。在传递给需要知道每个主体类型的代码之前,检查主体的可能顺序。您可以通过使用 as? 进行条件转换或检查每个主体的 categoryBitMask(在具有多种碰撞的游戏中更普遍有用)来完成此操作。

关于当 SKPhysicsBody.node -> SKLabelNode 时出现 Swift ClassCastException。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26316484/

相关文章:

facebook-graph-api - 使用 Swift 在 iOS SDK 中处理 Facebook Graph API 结果

java - 将 Object[] 转换为 java 中的引用类型数组

ios - 将 PinTintColor 调整为 mapkit 的 Ray Wenderlich 教程

iOS9 Facebook登录canOpenURL错误

swift - 使用当前用户电子邮件设置值

java - 如何将 arraylist 转换为类

java - ClassLoader问题导致ClassCastException的解决方法

swift - 如何使枚举符合 Swift 中的协议(protocol)?

java - 无法转换为 java.lang.Comparable

lucene - java.lang.ClassCastException : . .. Lucene40PostingsFormat 错误