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

Swift 闭包存储属性初始化的优点是什么?,swift,properties,initialization,Swift,Properties,Initialization,将类的属性初始化为以下内容时,此代码的区别和优缺点是什么: 一, 以及: 二, 这两个代码段都声明并初始化,但在第一个代码段中,它是通过闭包初始化的。应该使用闭包设置存储属性的原因是:需要进行自定义,例如调用方法;: 如果存储属性的默认值需要一些自定义或 设置时,可以使用闭包或全局函数来提供 该属性的自定义默认值。每当一个新的 属性所属的类型已初始化,闭包或 函数,并将其返回值指定为属性的 默认值 这意味着您将能够: let menuBar:MenuBar = { let mb = Me

将类的属性初始化为以下内容时,此代码的区别和优缺点是什么:

一,

以及:

二,


这两个代码段都声明并初始化,但在第一个代码段中,它是通过闭包初始化的。应该使用闭包设置存储属性的原因是:需要进行自定义,例如调用方法;:

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

这意味着您将能够:

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” 打印字符串

此外,在某些情况下,建议将您的属性声明为lazy:

意味着:

惰性存储属性是初始值不为的属性 计算到第一次使用时为止。您表示一个懒惰的存储 属性,在其声明之前写入惰性修饰符


可能相关:在这种特殊情况下,使用没有区别。1.如果重用UI元素,它会将初始化指令打包到闭包函数中并执行,然后将其存储在常量中。例如,如果您自定义mb.background或任何有用的内容,或者对于具有特定字体的标签,具有特定缩放模式的UIImage。。。
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
    }()
}
lazy var menuBar:MenuBar = {
     let mb = MenuBar()
     // for example, you'd need to call "doSomething" method
     // before returning the instance:
     menuBar.doSomething()
     return mb
 }()