2017-10-06 36 views
1

我想弄清楚如何捕獲在Swift中關閉工作。Swift如何在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變量。

這是如何工作的?閉包如何保持對尚未初始化的變量的強引用?

+1

比較https://stackoverflow.com/q/43171341/2976878 – Hamish

+1

請注意,在您的示例中,'worker' *是初始化的,它會隱式地初始化爲'nil'(然後您分配給它一個對一個新的「工人」實例)。 – Hamish

+0

工人事實上已初始化,但稍後纔會進行初始化。在關閉創建的那一刻,工人仍然是零。 – itskoBits

回答

0

Swift中的閉包通過引用捕獲所有變量,就像Objective-C中塊被捕獲的變量聲明爲__block的方式一樣。因此,在閉包創建後對閉包外部的變量進行的更改仍會在閉包中運行時看到。