2016-08-07 3 views
1

я работаю с Swift и SpriteKitПеречислите членов класса в Swift

У меня есть класс:

class Button: SKShapeNode 
{ 
} 

И у меня есть несколько кнопок:

var button1 = Button() 
var button2 = Button() 

И я уже использовать ".name" этих узлов:

button1.name = "button1" 
button2.name = "button2" 

Итак, я обычно перечисляю узлы узлов с enumerateChildNodesWithName("button"), но здесь имя уже принято, поэтому как я могу перечислить все мои кнопки (которые используют кнопку класса)?

ответ

1

Вы можете перечислить все дочерние узлы данного узла, вызвав enumerateChildNodesWithName с //* в качестве имени узла. Это приведено в качестве примера в документации Apple here.

Затем в блоке проверьте, имеет ли узел тип Button и выполните свое действие соответственно.

Так что-то вроде этого:

myNode.enumerateChildNodesWithName("//*") { node, ptr in 
    if node is Button { 
     // do something here 
    } 
} 
+0

Спасибо, я не сделал узнайте об этом методе! И почему вы используете 'ptr'? Я всегда использую '_', что он меняет? – Drakalex

+1

Второй аргумент в замыкании - это указатель на логическую переменную, которая может быть установлена ​​в true, чтобы закончить перечисление раньше. Если вы не собираетесь использовать второй аргумент, игнорирование его с помощью '_' - лучшая практика. В вашем случае вы хотите выполнить поиск по всем узлам, поэтому вам не нужно рано заканчивать работу. – nathan

+1

Вы также можете использовать свойство '.children' вместо' enumerateChildNodesWithName' – danielbeard

1

Вы можете использовать children свойство узла:

var buttonNodes = node.children.filter { $0 is Button }

Полный пример:

import UIKit 
import SpriteKit 

let node = SKNode() 

class Button: SKNode { 
} 

let button1 = Button() 
let button2 = Button() 
let label = SKLabelNode() 

node.addChild(button1) 
node.addChild(button2) 
node.addChild(label) 

let buttons = node.children.filter { $0 is Button } 
print(buttons.count) // buttons only has 2 elements, the button nodes! 
Смежные вопросы