swift documentation的捕获值部分:
...它通过捕获对周围函数的runningTotal和amount的引用并在其自己的函数体中使用它来实现此目的。 ...
和
如果您创建第二个增量器,它将拥有自己存储的对新的单独runningTotal变量的引用。
所以我尝试以下测试并得出结论,因为makeIncrementer(forIncrementer:)
生成的每个增量器都有自己的runningTotal
,runningTotal
的值记住每个增量器,捕获的值相当于为闭包创建一些静态变量。但我不确定我的陈述是否正确。
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementer() -> Int {
runningTotal += amount
return runningTotal
}
return incrementer
}
let by10Incrementer = makeIncrementer(forIncrement: 10)
let by20Incrementer = makeIncrementer(forIncrement: 20)
for i in 0..<5 {
print(by10Incrementer())
}
print("---")
for j in 0..<5 {
print(by20Incrementer())
}
输出:
10
20
30
40
50
---
20
40
60
80
100
我原本以为by20Incrementer()
的输出会从50开始,但是从0开始。所以每个增量器的runningTotal
指的是不同的。{/ p>
答案 0 :(得分:3)
封闭中的捕获不会变为静态,因为闭包的每个实例都有自己的变量副本。
我原本以为
by20Incrementer()
的输出将从50开始,但它从0开始
它从创建闭包时的runningTotal
值开始,始终为零。无论您在runningTotal
中增加多少次by10Incrementer
,它都不会更改runningTotal
中捕获的by20Incrementer
的值,因为它是一个不同的实例自己捕获runningTotal
。
实际上,runningTotal
成为表示闭包的对象的var
。 Swift语法使这个捕获隐式,但内部变量就在那里。