Swift中的闭包如何在引擎盖下捕获变量?

时间:2017-10-06 14:02:06

标签: 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变量仍为零。但是,闭包将成功捕获worker变量。

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

1 个答案:

答案 0 :(得分:0)

Swift中的闭包通过引用捕获所有变量,就像Objective-C中的块捕获声明为__block的变量一样。因此,在闭包运行之后,仍会在闭包中看到对闭包外部变量的更改。