当我创建一个常量来使我的闭包起作用时:
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
}
答案 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
,当该调用返回时,该变量将被销毁。 但,因为runningTotal
被incrementer
捕获为变量,只要incrementer
需要incrementer
,其生命周期就会自动延长{ {1}}本身是必需的。由于incrementer
是makeIncrementer
返回的值,runningTotal
的生命周期延长到调用makeIncrementer
的生命周期。
稍后每次调用单个调用makeIncrementer
时返回的函数,因为它已从该调用中捕获变量runningTotal
,它将增加10并且当前返回值。
如果你两次调用makeIncrementer
并存储两个结果,那么每个结果都会引用一个 distinct 函数,并且每个函数都引用一个 distinct 变量 - 所以你有两个不同的递增计数器。
HTH