循环遍历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. }