在swift中捕获闭包的值是否意味着创建静态变量?

时间:2017-06-05 15:05:08

标签: swift closures

swift documentation捕获值部分:

  

...它通过捕获对周围函数的runningTotal和amount的引用并在其自己的函数体中使用它来实现此目的。 ...

  

如果您创建第二个增量器,它将拥有自己存储的对新的单独runningTotal变量的引用。

所以我尝试以下测试并得出结论,因为makeIncrementer(forIncrementer:)生成的每个增量器都有自己的runningTotalrunningTotal的值记住每个增量器,捕获的值相当于为闭包创建一些静态变量。但我不确定我的陈述是否正确。

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>

1 个答案:

答案 0 :(得分:3)

封闭中的捕获不会变为静态,因为闭包的每个实例都有自己的变量副本。

  

我原本以为by20Incrementer()的输出将从50开始,但它从0开始

它从创建闭包时的runningTotal值开始,始终为零。无论您在runningTotal中增加多少次by10Incrementer,它都不会更改runningTotal中捕获的by20Incrementer的值,因为它是一个不同的实例自己捕获runningTotal

实际上,runningTotal成为表示闭包的对象的var。 Swift语法使这个捕获隐式,但内部变量就在那里。