Перечислить членов класса в Swift

Я работаю со Swift и SpriteKit.

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

class Button: SKShapeNode
{
}

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

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

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

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

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


person Drakalex    schedule 07.08.2016    source источник


Ответы (2)


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

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

Что-то вроде этого:

myNode.enumerateChildNodesWithName("//*") { node, ptr in
    if node is Button {
        // do something here
    }
}
person nathangitter    schedule 07.08.2016
comment
Спасибо, я не знал об этом методе! И почему вы используете ptr ? Я всегда использую _, что это меняет? - person Drakalex; 07.08.2016
comment
Второй аргумент в замыкании — это указатель на логическую переменную, которой можно присвоить значение true, чтобы завершить перечисление досрочно. Если вы не собираетесь использовать второй аргумент, лучше всего игнорировать его с помощью _. В вашем случае вы хотите выполнить поиск по всем узлам, поэтому вам не нужно завершать работу раньше. - person nathangitter; 07.08.2016
comment
Вы также можете использовать свойство .children вместо enumerateChildNodesWithName - person danielbeard; 07.08.2016

Вы можете использовать свойство 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!
person danielbeard    schedule 07.08.2016