闭包存储属性初始化的优点是什么?

时间:2018-03-30 08:31:14

标签: swift properties initialization

在将类的属性初始化为:

时,此代码的区别和优点/缺点是什么

1

let menuBar:MenuBar = {
        let mb = MenuBar()
        return mb
    }()

2

let menuBar = MenuBar()

1 个答案:

答案 0 :(得分:2)

两个代码片段都声明并初始化 stored properties ,但在第一个代码片段中,它由闭包初始化。您应该使用闭包设置存储属性的原因是:有一个要求进行自定义(例如,调用方法); Adapted from The Swift Programming Language (Swift 4.1) - Initialization: Setting a Default Property Value with a Closure or Function

  

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

这意味着您可以这样做:

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

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

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

        // this won't work
        print(myString)

        return anInt
    }()
}

上面代码片段的结果是出现编译时错误:

  

错误:实例成员' 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
 }()

意味着:

  

惰性存储属性是一个初始值不是的属性   计算直到第一次使用。你表示存储懒惰   通过在声明之前编写惰性修饰符来进行属性。