在将类的属性初始化为:
时,此代码的区别和优点/缺点是什么1
let menuBar:MenuBar = {
let mb = MenuBar()
return mb
}()
和
2
let menuBar = MenuBar()
答案 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
}()
意味着:
惰性存储属性是一个初始值不是的属性 计算直到第一次使用。你表示存储懒惰 通过在声明之前编写惰性修饰符来进行属性。