首页 > 解决方案 > 我不理解此类中的参数(Swift)

问题描述

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

我正在研究树数据结构和遍历它的算法。我在网上找到了一些代码,但我很奇怪我在函数中使用参数作为闭包。

访问(价值)

参数的这个闭包在这个代码示例中是如何工作的?

我试图搜索以了解它,但我什至不知道在搜索时使用什么关键字。

谢谢。

标签: swiftalgorithmparameterstreeclosures

解决方案


一、声明

visit: (Element) -> Void

在上面的代码visit中被声明为一个closure类型(Element)->Void。无论在何处调用,它都会接受类型Element泛型类型)的值。

2.初始化

由于traverseInOrder(visit:)接受 a closure,所以在调用此方法时传递一个。

这就是您closure通常初始化的方式,

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

下面的代码与上面的代码相同,只是它的简写。

tree.traverseInOrder {
    print($0)
}

3. 打电话

 visit(value)

这就是您visit closure通过在其中传递相关值来调用的方式。


推荐阅读