在lazy var定义之后括号做了什么?

时间:2016-02-06 05:38:51

标签: swift parentheses computed-properties

我正在分析分析一些第三方代码,并且有一个"懒惰" var语句看起来像这样,我想了解括号在"计算属性"之后做了什么。花括号:

lazy var defaults:NSUserDefaults = {
    return .standardUserDefaults()
}()

"返回.standardUserDefaults()"返回NSUserDefaults实例对象,为什么在右大括号后添加一个()?

感谢

2 个答案:

答案 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