【问题标题】:Swift ClassCastException when SKPhysicsBody.node -> SKLabelNode. Why?SKPhysicsBody.node -> SKLabelNode 时出现 Swift ClassCastException。为什么?
【发布时间】:2014-12-06 15:07:56
【问题描述】:

以下代码导致类转换异常。谁能解释一下为什么?

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: 0x1046689ac; swift_dynamicCastObjCClassUnconditional + 44 0x104668993: movq 0x7f236(%rip), %rsi ; “isKindOfClass:” 0x10466899a: movq %rbx, %rdi 0x10466899d: movq %rcx, %rdx 0x1046689a0:调用 0x10466b46a;符号存根:objc_msgSend 0x1046689a5: testb %al, %al 0x1046689a7: movq %rbx, %rax 0x1046689aa: 0x1046689b3; swift_dynamicCastObjCClassUnconditional + 51 0x1046689ac: addq $0x8, %rsp 0x1046689b0:popq %rbx 0x1046689b1:popq %rbp 0x1046689b2: retq
0x1046689b3: 泄漏 0xc158(%rip), %rax ; “Swift 动态转换失败” 0x1046689ba: movq %rax, 0x87427(%rip) ; gCRAnnotations + 8 0x1046689c1: int3
0x1046689c2: nopw %cs:(%rax,%rax)

【问题讨论】:

  • 您尚未将firstBodysecondBody 设置为任何内容。为什么需要将firstBody.nodesecondBody.node 分别投射到SKSpriteNote 和SKLabelNode 中?
  • 我正在用另一种方法进行额外的处理,例如:projectile.removeFromParent() flyLabel.removeFromParent()
  • 不能保证节点在冲突委托方法中的顺序是这样的(假设是这样)。 firstBody.node 可能是 SKLabelNodesecondBody.node 可能是 SKSpriteNode
  • 这就解决了。谢谢!

标签: swift classcastexception


【解决方案1】:

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

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

【讨论】:

  • 这就解决了。谢谢!
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
相关资源
最近更新 更多