typealias IntMaker = (Void)->Int
func makeCounter() ->IntMaker{
var n = 0 // Line A
func adder()->Integer{
n = n + 1
return n
}
return adder
}
let counter1 = makeCounter()
counter1() // returns 1
counter1() // returns 2
counter1() // returns 3
不是每次我们调用 counter1()
时都会调用“Line A”吗?这意味着 var n = 0
应该每次都被调用......
为什么计数器返回不同的值?他们不应该总是返回“1”吗?
最佳答案
显然,每次调用 counter1
时,A 行不会被调用。
事件的顺序是:
makeCounter
被调用,它声明并初始化n
(A行),定义adder
,并返回adder
在包含已定义并初始化为 1 的n
的上下文中。正是这个刚刚返回的函数被赋值给
counter1
。因为 A 行不是该函数的一部分 (adder
/counter1
),所以在调用该函数时不会执行它。对
counter1
的每次调用都在相同的上下文中执行,这就是为什么n
在调用中保留其值的原因:它们都访问相同的n
.
关于swift - 闭包如何从之前的调用中捕获值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37839020/