【发布时间】: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)
【问题讨论】:
-
您尚未将
firstBody和secondBody设置为任何内容。为什么需要将firstBody.node和secondBody.node分别投射到SKSpriteNote 和SKLabelNode 中? -
我正在用另一种方法进行额外的处理,例如:projectile.removeFromParent() flyLabel.removeFromParent()
-
不能保证节点在冲突委托方法中的顺序是这样的(假设是这样)。
firstBody.node可能是SKLabelNode和secondBody.node可能是SKSpriteNode。 -
这就解决了。谢谢!