我正在分析分析一些第三方代码,并且有一个"懒惰" var语句看起来像这样,我想了解括号在"计算属性"之后做了什么。花括号:
lazy var defaults:NSUserDefaults = {
return .standardUserDefaults()
}()
"返回.standardUserDefaults()"返回NSUserDefaults实例对象,为什么在右大括号后添加一个()?
感谢
答案 0 :(得分:5)
这意味着访问了第一次执行默认值的块。如果没有()
,则表示默认值是() -> NSUserDefaults
类型的变量的块类型。当您添加()
时,它意味着它只是NSUserDefaults
,它是在访问时执行的块返回的。
答案 1 :(得分:1)
我想出了两个例子。第一个示例是典型的 computed property
。每次调用变量时它都会运行。
var num = 0
var myName: String {
print(num)
return "xxx"
}
print(myName)
// 0
// xxx
num += 1
print(myName)
// 1
// xxx
第二个示例是 self-executing closure
。如您所见,它仅在第一次调用时运行 print(num)。
var num = 0
var myName: String = {
print(num)
return "xxx"
}()
print(myName)
// 0
// xxx
num += 1
print(myName)
// xxx
为了进一步说明,我返回了 num 并查看它是否在 SEC 中发生变化。它没有。这意味着该块仅在第一次被调用时运行,并在此后为自己分配返回值。出于所有意图和目的,在第一次调用之后,MyNum 现在为 0,不再是块。
var num = 0
var myNum: Int = {
print(myNum)
return myNum
}()
print(myNum)
// 0
// 0
num += 1
print(myNum)
// 0