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

Posted

技术标签:

【中文标题】闭包存储属性初始化有啥好处?【英文标题】:What is the advantage of closure stored property Initialisation?闭包存储属性初始化有什么好处? 【发布时间】:2018-09-09 07:06:49 【问题描述】:

将类的属性初始化为:

1.

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

和:

2.

let menuBar = MenuBar()

【问题讨论】:

可能相关:***.com/questions/31515805/… 在这种特殊情况下,使用“没有”差异。 1.如果您重用UI元素会更好,它将初始化指令打包在一个闭包(函数)中并执行它()然后将其存储在您的常量中。例如,如果您自定义 mb.background 或任何有用的东西,或者对于具有特定字体的标签,具有特定缩放模式的 UIImage ... 【参考方案1】:

代码 sn-ps 都声明并初始化了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
    ()

上述代码sn-p的结果是编译时错误:

错误:实例成员“myString”不能用于类型“MyType” 打印(我的字符串)


此外在某些时候,建议将您的属性声明为 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
 ()

意思是:

惰性存储属性是初始值不是 计算到第一次使用为止。你表示一个惰性存储 通过在声明之前写入惰性修饰符来获得属性。

【讨论】:

以上是关于闭包存储属性初始化有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

像这样初始化 jQuery 有啥好处?

闭包有啥好处,它们通常在啥时候使用?

Swift 中的可选闭包属性

初始化变量:在所有成员初始化之前由闭包捕获的“自我”

有啥理由用同步集合初始化实体属性?

如何使用这样的闭包参数初始化结构?