swift - 闭包如何从之前的调用中捕获值?

标签 swift closures nested-function

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

不是每次我们调用 counter1() 时都会调用“Line A”吗?这意味着 var n = 0 应该每次都被调用......

为什么计数器返回不同的值?他们不应该总是返回“1”吗?

最佳答案

显然,每次调用 counter1 时,A 行不会被调用。

事件的顺序是:

  • makeCounter被调用,它声明并初始化n(A行),定义adder,并返回adder 在包含已定义并初始化为 1 的 n 的上下文中

  • 正是这个刚刚返回的函数被赋值给counter1。因为 A 行不是该函数的一部分 (adder/counter1),所以在调用该函数时不会执行它。

  • counter1 的每次调用都在相同的上下文中执行,这就是为什么 n 在调用中保留其值的原因:它们都访问相同的 n.

关于swift - 闭包如何从之前的调用中捕获值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37839020/

相关文章:

swift - 如何在 SpriteKit 中创建图像节点? swift 4

ios - 为什么我的表格 View 中的单元格不显示任何文本?

java - 如何使用 Java 8 流映射到多个元素?

Python 内部函数集与非局部函数集

common-lisp - CL 中的辅助嵌套函数

带有嵌套函数的 Swift 简洁代码

ios - UISlider 更改 View 上绘制的线条宽度?

ios - 无法从 Dark Sky API 获取数据

javascript - 使用 JavaScript 计算函数调用

python - 对 lambda 和列表理解感到困惑