什么在嵌套函数中首先执行?

时间:2016-03-27 01:18:00

标签: xcode swift closures

当我创建一个常量来使我的闭包起作用时:

let incrementByTen = makeIncrementer(forIncrement: 10)

它是否跳过 incrementmenter(),直到在return语句中调用它,这样return语句最后可以运行incrementer()函数并接收它的值?

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}

2 个答案:

答案 0 :(得分:0)

调用函数时会计算函数的参数。在这种情况下,这意味着当调用makeIncrementer时,将在实际调用makeIncrementer之前评估它的参数(在本例中为10)。

同样,当调用makeIncrementer时,它的代码将按顺序执行,初始化runningTotal然后初始化incrementer(请注意此时amount已经评估过了,所以在返回的增量中,它总是10。

随后,当您调用incrementByTen()时,没有参数传递,并且在调用之前没有任何要评估的内容,作为执行闭包的一部分,runningTotal将按数量递增,在这种情况下,总是为10. / p>

答案 1 :(得分:0)

在评论中,您已将问题扩展为:

  

我已经读过这个函数捕获对runningTotal和amount的引用。当我反复调用incrementByTen()时,很难理解它是如何不断增加的。

函数incrementer捕获amount变量 runningTotal。捕获值只需将值复制到函数值(又名闭包)。

捕获变量更为复杂:因为局部变量runningTotal的生命周期通常只会扩展到它创建的函数调用的末尾 - 所以调用到makeIncrementer将创建一个新的本地runningTotal,当该调用返回时,该变量将被销毁。 ,因为runningTotalincrementer捕获为变量,只要incrementer需要incrementer,其生命周期就会自动延长{ {1}}本身是必需的。由于incrementermakeIncrementer返回的值,runningTotal的生命周期延长到调用makeIncrementer的生命周期。

稍后每次调用单个调用makeIncrementer时返回的函数,因为它已从该调用中捕获变量runningTotal,它将增加10并且当前返回值。

如果你两次调用makeIncrementer并存储两个结果,那么每个结果都会引用一个 distinct 函数,并且每个函数都引用一个 distinct 变量 - 所以你有两个不同的递增计数器。

HTH