下面的代码片段从official document中复制,用于演示如何使用扩展来将方法添加到现有类型。

extension Int {
    func repetitions(task: () -> Void) {
        for _ in 0..<self {
            task()//what's going on here?
        }
    }
}

3.repetitions { //why I don't have to call as `repetitions()`
    print("Hello!")
}

问题:问题不是问灭绝是如何扩展的。我只是对这段代码有点困惑,为什么看起来是这样?为什么在功能体内部使用task()?它是从哪里来的?对于3.repetition行,为什么不写为3.repetition()
谢谢

最佳答案

repetitions是一个函数,它接受一个函数作为参数并多次调用该函数。
要调用repetitions,我们可以说(注意,这是Swift 3):

func sayHi() {
    print("Hello")
}
3.repetitions(task:sayHi)

但为什么要定义一个额外的名称?相反,我们使用匿名函数:
3.repetitions(task:{print("Hello"})

但在这种情况下,我们可以省略对sayHi的调用中的括号,并使用尾随语法:
3.repetitions{print("Hello")}

10-02 02:44