初始化类的属性时,此代码有什么区别以及优点/缺点:
1.
let menuBar:MenuBar = {
let mb = MenuBar()
return mb
}()
and:
2.
let menuBar = MenuBar()
两个代码片段都声明并初始化存储的属性 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID255,但在第一个中它是通过闭包初始化的。您应该使用闭包设置存储属性的原因是:需要进行定制(例如调用方法);改编自《Swift 编程语言》(Swift 4.1) - 初始化:使用闭包或函数设置默认属性值 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-ID232:
如果存储属性的默认值需要一些自定义或
设置时,您可以使用闭包或全局函数来提供
该属性的自定义默认值。每当有一个新实例
属性所属的类型被初始化,闭包或
函数被调用,其返回值被指定为属性的
默认值。
这意味着您将能够执行以下操作:
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:
lazy var menuBar:MenuBar = {
let mb = MenuBar()
// for example, you'd need to call "doSomething" method
// before returning the instance:
menuBar.doSomething()
return mb
}()
意思是:
惰性存储属性是指初始值不是的属性
直到第一次使用时才计算。您指示了一个惰性存储
属性通过在其声明之前编写惰性修饰符来实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)