ios - Swift:无法将 AnyObject 向下转换为 SKPhysicsBody

标签 ios arrays casting swift sprite-kit

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
}

但这也会因以下原因而崩溃:

enter image description here

同样我试过这个:

 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/

相关文章:

c++ - 我是否应该期望单继承中的向上转型和向下转型不调整指针?

android - 您如何做到这一点,以便您可以使用电话号码登录应用程序?

javascript - 如何将数据插入具有多个同名输入的数据库中?

c++ - 使用运行时类型识别从 void 指针获取数据

c - 如何分离一个数组并将其存储到一个新数组中?

javascript - 使用 Javascript 中的数组验证设备 ID

c++ - 错误 : Conversion from integral type to pointer type requires reinterpret_cast, C 风格转换或函数风格转换

ios - 如何在 iphone 中获取单元值?

ios - 从应用商店更新后,应用程序因 SQLite 错误而崩溃

ios - UITableViewCell 中图像的动态帧计算