swift - Swift 中的闭包如何在幕后捕获变量?

标签 swift closures

我想弄清楚在 Swift 闭包中捕获是如何工作的。

让我们假设下面的代码示例

class Worker {
    let block: () -> Void
    let id: String

    init(id: String, block: @escaping  () -> Void) {
        self.id = id
        self.block = block
    }
}

var worker: Worker!

worker = Worker(id: "1", block: { _ in
    print(worker.id)
})

在创建闭包的那一刻,worker 变量仍然是 nil。但是,闭包将成功捕获 worker 变量。

这是如何运作的?闭包如何保持对尚未初始化的变量的强引用?

最佳答案

Swift 中的闭包通过引用 捕获所有变量,就像声明为 __block 的变量如何被 Objective-C 中的 block 捕获一样。因此,在闭包创建后对闭包外部变量的更改在闭包运行时仍然可以看到。

关于swift - Swift 中的闭包如何在幕后捕获变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46607557/

相关文章:

ios - Swift 中“String”无法转换为 'Int'

ios - 如何提取 DynamoDB 表中的第一行?

swift - 在 2 级节点内调用子节点

javascript - 当为循环中的每个元素分配不同的事件监听器时,它们都运行相同的函数,尽管使用了 .bind() 和闭包

ios - 未召集委托(delegate)

ios - 如何使用 Swift 通过 WebSockets 创建和发送 UInt8Array

javascript - 变量范围。使用闭包?

Javascript - 多个 XmlHttpRequest,并将它们与目标 div 关联

python - 为什么 Python 不能在闭包中增加变量?

c# - foreach 和 list.ForEach() 之间的闭包有何不同?