闭包如何捕获先前调用的值?

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'吗?

Ale*_*ica 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.

  • A 行是 `makeCounter` 的一部分;它不是“adder”/“counter1”的一部分。 (2认同)