Я не понимаю параметр в этом классе (Swift) - PullRequest
0 голосов
/ 06 февраля 2020
public class BinaryNode<Element> {
    public var value: Element 
    public var leftChild: BinaryNode? 
    public var rightChild: BinaryNode? 
    public init(value: Element) { self.value = value }

    public func traverseInOrder(visit: (Element) -> Void) {
        leftChild?.traverseInOrder(visit: visit)

        visit(value) // <--- this code.

        rightChild?.traverseInOrder(visit: visit)

    }
}

var tree: BinaryNode<Int> {

    let zero = BinaryNode(value: 0)
    let one = BinaryNode(value: 1)
    let five = BinaryNode(value: 5)
    let seven = BinaryNode(value: 7)
    let eight = BinaryNode(value: 8)
    let nine = BinaryNode(value: 9)

    seven.leftChild = one
    one.leftChild = zero
    one.rightChild = five
    seven.rightChild = nine
    nine.leftChild = eight

    return seven // root node
}

// for print it
tree.traverseInOrder {
    print($0)
}
// result:
// 0
// 1
// 5
// 7
// 8
// 9

Я изучаю древовидную структуру данных и алгоритм ее обхода. Я нашел какой-то код в сети, но мне довольно странно, что я использую параметр в качестве замыкания в функции.

посещение (значение)

Как работает это замыкание из параметра в этом примере кода?

Я попытался найти его, чтобы понять, но даже не знаю, какое ключевое слово использовать при его поиске.

Спасибо.

1 Ответ

0 голосов
/ 06 февраля 2020

1. Декларация

visit: (Element) -> Void

В приведенном выше коде visit объявляется как closure типа (Element)->Void. Он будет принимать значение типа Element ( generi c type ), где бы оно ни вызывалось.

2. Инициализация

Поскольку traverseInOrder(visit:) принимает closure, то вы передаете его при вызове этого метода.

Так вы обычно инициализируете closure,

tree.traverseInOrder { (value) in
    print(value)
}

Код ниже - то же самое, что и выше, только сокращение для него.

tree.traverseInOrder {
    print($0)
}

3. Вызов

 visit(value)

Вот как вы вызываете visit closure, передав ему соответствующее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...