【发布时间】:2016-01-21 04:55:19
【问题描述】:
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] {
}
但我收到此错误。
致命错误:数组不能向下转换为派生数组
我也试过这个:
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”包含对象,那么转换失败并且“body”将变为 nil,所以我不能循环遍历它。目前似乎不可能将 AnyObject 强制转换为 SKPhysicsBody,从而无法循环遍历“allContactedBodies”数组,除非有人可以提供解决方法。
编辑 3:Xcode 6 beta 5 中仍然存在错误。下面发布的解决方法仍然有效
编辑 4:Xcode 6 beta 6 中仍然存在错误。下面发布的解决方法仍然有效
编辑5:失望。 Xcode 6 GM 中仍然存在错误。下面发布的解决方法仍然有效
编辑 6:我收到了来自 Apple 的以下消息:
工程提供了以下信息:
我们相信这个问题已在最新的 Xcode 6.1 测试版中得到解决。
但事实并非如此,该错误仍在 Xcode 6.1.1 中!!!解决方法仍然有效。
编辑 7: Xcode 6.3,仍未修复,解决方法仍然有效。
【问题讨论】:
-
我认为 SpriteKit 在 XCode6/ios stackoverflow.com/questions/24069168/… stackoverflow.com/questions/24222174/… 中无法正常工作是一个已知问题
-
是的,尽管您提供的链接适用于 iOS 7。真正的问题似乎是无法将 AnyObject 转换为 SKPhysicsBody。除非可能有解决方法。
-
尝试让body = object!作为 SKPhysicsBody
-
这不起作用,因为 object 不是可选类型,所以你不能解开它。数组本身是一个隐式展开的可选类型,但数组中的 AnyObject 元素没有声明为可选类型。
标签: ios arrays casting swift sprite-kit