循环遍历SKNode的所有孩子?
我有一个带有多个子SKSpriteNodes的SKNode。 一个简化的例子:
var parentNode = SKNode() var childNode1 = SKSpriteNode() var childNode2 = SKSpriteNode() self.addChild(parentNode) parentNode.addChild(childNode1) parentNode.addChild(childNode2)
我想对所有这些孩子运行colorizeWithColor
动作。 当我在parentNode
上运行动作时,没有任何效果。
我不能在父项上使用enumerateChildNodesWithName
,因为它的许多子项已经有我正在使用的名称。
有没有办法循环遍历parentNode
所有子parentNode
,以便对所有子parentNode
运行单个操作?
您可以简单地枚举parentNode.children
:
for child in parentNode.children as! [SKNode] { // ... }
如有必要,检查每个孩子是否真的是SKSpriteNode
:
for child in parentNode.children { if let spriteNode = child as? SKSpriteNode { // ... } }
从Swift 2(Xcode 7)开始,枚举和可选的强制转换可以与带有case-pattern的for循环结合使用:
for case let child as SKSpriteNode in parentNode.children { // ... }
截至2017年..
代码确实是公正的
for case let child as SKSpriteNode in parentNode.children { // ... }
但。
性能非常糟糕:它无法使用。
你必须保留自己的清单。
当然,如果你要创造一些“坦克”或“宇宙飞船”,你自然会将它们保存在列表中。 如果你需要迭代,这是唯一可行的方法。
我跑了一些像这样的测试代码……
// try Apple's native .children call... for case let s as SomeSpriteClass in children { k += 1 } let t1 = a.microseconds() // simply use your own list... let b = Date() for s in spaceships { k += 1 } let t2 = b.microseconds() print("\(t1) \(t2)")
如果您只是遍历自己的列表,它会快3到4倍。
iPad上的典型输出……
939 43 140 33 127 33 117 37 109 30 126 33 127 33 109 29 96 30 96 29 99 30 97 30 97 30
(特别是,正如您所期望的那样,内置枚举永远是“第一”时间。)
鉴于性能, 在实践中有必要保留自己的精灵列表并运行它。
您可以通过访问父项的children
属性来获取子项的数组,然后循环它们并在它们上运行colorizeWithColor
。
let children = parentNode.children for child in children { // Do something. }