闭包存储属性初始化有什么好处?

PaF*_*aFi 2 initialization properties swift

将类的属性初始化为:

1.

let menuBar:MenuBar = {
        let mb = MenuBar()
        return mb
    }()
Run Code Online (Sandbox Code Playgroud)

和:

2.

let menuBar = MenuBar()
Run Code Online (Sandbox Code Playgroud)

Ahm*_*d F 5

两个代码片段都声明并初始化了存储的属性,但在第一个片段中,它是由闭包初始化的。您应该使用闭包设置存储属性的原因是:需要进行自定义(例如调用方法);改编自 Swift 编程语言 (Swift 4.1) - 初始化:使用闭包或函数设置默认属性值

如果存储属性的默认值需要一些自定义或设置,您可以使用闭包或全局函数为该属性提供自定义默认值。每当初始化属性所属类型的新实例时,就会调用闭包或函数,并将其返回值分配为属性的默认值。

这意味着你将能够做到:

let menuBar:MenuBar = {
    let mb = MenuBar()
    // for example, you'd need to call "doSomething" method
    // before returning the instance:
    menuBar.doSomething()
    return mb
}()
Run Code Online (Sandbox Code Playgroud)

请注意,在存储属性闭包的主体中,您将无法使用类/结构中的其他属性,因为它们被认为尚未初始化。例子:

struct MyType {
    let myString = "My String!"
    let myInt: Int = {
        let anInt = 101

        // this won't work
        print(myString)

        return anInt
    }()
}
Run Code Online (Sandbox Code Playgroud)

上面代码片段的结果是得到一个编译时错误:

错误:实例成员 'myString' 不能用于类型 'MyType' 打印(myString)


此外,在某些时候,建议将您的财产声明为lazy

lazy var menuBar:MenuBar = {
     let mb = MenuBar()
     // for example, you'd need to call "doSomething" method
     // before returning the instance:
     menuBar.doSomething()
     return mb
 }()
Run Code Online (Sandbox Code Playgroud)

意思是:

惰性存储属性是一种直到第一次使用才计算其初始值的属性。您可以通过在声明之前编写惰性修饰符来指示惰性存储属性。