Hon*_*ney 9 closures nested-function swift
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
Run Code Online (Sandbox Code Playgroud)
每次打电话都不叫"A线" counter1()?var n = 0每次都应该调用的意思......
为什么计数器返回不同的值?他们不应该总是回归'1'吗?
你已经打过makeCounter()一次电话了。这将创建您的新闭包,并将其分配给counter1. 这个闭包关闭了 mutable var n,并且只要这个闭包存在,就会保持捕获状态。
调用counter1()将执行它,但它保留相同的 capture n,并改变它。这个特定的“加法器”将始终捕获相同的内容n,只要它存在。
为了获得您建议的行为,您需要创建新的闭包来捕获以下新实例n:
let counter1 = makeCounter()
counter1() // returns 1
counter1() // returns 2
counter1() // returns 3
var counter2 = makeCounter()
counter2() // returns 1
counter2 = makeCounter()
counter2() // returns 1
counter2 = makeCounter()
counter2() // returns 1
Run Code Online (Sandbox Code Playgroud)
现在两者counter1都有counter2自己独立的n.