簡體   English   中英

通過閉包初始化屬性

[英]Initializing property via closure

我觀察到人們有時使用閉包來初始化屬性。 例如代替

lazy var test1: String = String("a string")

他們使用

lazy var test2: String = { String("a string") }()

使用閉包初始化屬性有什么好處/方便?

這兩個做同樣的工作。 當您需要額外的代碼來配置屬性對象時,閉包初始化就派上用場了。 例如:

lazy var point: CGPoint = {
    let x = ...
    let y = ...
    return CGPoint(x: x, y: y)
}()

一般來說,如果惰性變量在初始化之后不需要額外的工作,那么在沒有閉包初始化的情況下聲明它就足夠了。

例如,對於一個簡單的字符串,實現是公平的:

lazy var myString = "a string"

然而,當涉及到需要更多編輯(設置)的東西時——例如CLLocationManager ,你自然會使用閉包初始化:

lazy var locationManager: CLLocationManager = {
    var lm = CLLocationManager()

    // here is one extra thing to do:
    lm.delegate = self
    return lm
}()

如前所述,在某些時候我們需要在初始化之后做額外的步驟(在上面的例子中是lm.delegate = self )。

參考您的情況,由於初始化后不應發生任何事情,因此兩者:

lazy var test1: String = String("a string")

lazy var test2: String = { String("a string") }()

是相同的。 您應該使用第一個作為速記打字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM