gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:57:06 26 4
gpt4 key购买 nike

swift documentationCapturing Values 部分中:

... It does this by capturing a reference to runningTotal and amount from the surrounding function and using them within its own function body. ...

If you create a second incrementer, it will have its own stored reference to a new, separate runningTotal variable.

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

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开始,所以每个incrementer的runningTotal指的是不同的。

最佳答案

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

I originally thought that the output of by20Incrementer() would start from 50, but it starts from 0

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

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

关于swift - swift 中闭包的值捕获是否意味着创建静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44371935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com