【问题标题】:Does values capturing of closure in swift means creating static variable?快速捕获闭包的值是否意味着创建静态变量?
【发布时间】:2017-11-06 09:41:16
【问题描述】:

swift documentation捕获值部分:

...它通过从周围的函数中捕获对 runningTotal 和 amount 的引用并在自己的函数体内使用它们来实现这一点。 ...

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

所以我尝试了以下测试并得到一个结论,由于makeIncrementer(forIncrementer:) 生成的每个增量器都有自己的runningTotal 并且每个增量器记住 runningTotal 的值,所以values-capturing 相当于为闭包创建一些静态变量。但我不确定我的说法是否正确。

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指的是不同的。

【问题讨论】:

标签: swift closures


【解决方案1】:

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

本来以为by20Incrementer()的输出会从50开始,结果却是从0开始

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

实际上,runningTotal 变成了代表闭包的对象上的 var。 Swift 语法使这种捕获变得隐式,但在内部变量是存在的。

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 2012-08-14
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2015-07-31
    • 1970-01-01
    • 2016-05-13
    相关资源
    最近更新 更多