Apple 在 SKPhysicsBody 类中有以下方法。
/* Returns an array of all SKPhysicsBodies currently in contact with this one */
func allContactedBodies() -> [AnyObject]!
我注意到它返回一个 AnyObject 数组。所以我读到了如何处理向下转换 AnyObject Here
我想遍历物理体的 allContactedBodies 数组。问题是,无论我尝试什么,我都无法正常工作。
我首先尝试了这个:
for body in self.physicsBody.allContactedBodies() as [SKPhysicsBody] {
}
但是我得到了这个错误。
fatal error: array cannot be downcast to array of derived
我也试过这个:
for object in self.physicsBody.allContactedBodies() {
let body = object as SKPhysicsBody
}
但这也会因以下原因而崩溃:
同样我试过这个:
for object in self.physicsBody.allContactedBodies() {
let body = object as? SKPhysicsBody
}
没有崩溃,但是“body”变成了nil。
如果我根本不转换,我就不会崩溃。例如:
for object in self.physicsBody.allContactedBodies() {
}
但显然,如果我想使用实际类型,我需要强制转换。
那么作为测试,我只是尝试了这个:
let object: AnyObject = SKPhysicsBody()
let body = object as SKPhysicsBody
这也会导致与图片中相同的崩溃。
但其他类型不会崩溃。例如,这不会崩溃。
let object: AnyObject = SKNode()
let node = object as SKNode
所以我的问题是,我怎样才能正确地遍历 allContactedBodies 数组?
编辑:我在 iOS 8 beta 4 设备上运行 Xcode 6 beta 4。
编辑 2:更多信息
好的,所以我又做了一些测试。我试过这个:
let bodies = self.physicsBody.allContactedBodies() as? [SKPhysicsBody]
如果“allContactedBodies”为空,则转换成功。但是,如果“allContactedBodies”包含对象,则转换失败并且“bodies”将变为 nil,因此我无法循环遍历它。目前看来,将 AnyObject 转换为 SKPhysicsBody 是不可能的,因此无法循环遍历“allContactedBodies”数组,除非有人可以提供解决方法。
编辑 3:错误仍然存在于 Xcode 6 beta 5 中。下面发布的解决方法仍然有效
编辑 4:错误仍在 Xcode 6 beta 6 中。下面发布的解决方法仍然有效
编辑 5:失望。错误仍在 Xcode 6 GM 中。下面发布的解决方法仍然有效
编辑 6:我收到了来自 Apple 的以下消息:
Engineering has provided the following information:
We believe this issue has been addressed in the latest Xcode 6.1 beta.
但事实并非如此,这个错误仍然存在于 Xcode 6.1.1 中!!!解决方法仍然有效。
编辑 7:Xcode 6.3,仍未修复,解决方法仍然有效。
最佳答案
经过反复试验,我找到了解决问题的解决方法。事实证明,当类型为 AnyObject 时,您根本不需要向下转型来访问 SKPhysicsBody 的属性。
for object in self.physicsBody.allContactedBodies() {
if object.node??.name == "surface" {
isOnSurface = true
}
}
关于ios - Swift:无法将 AnyObject 向下转换为 SKPhysicsBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25004232/