lazy var 定义后的括号是做什么用的?

what do parenthesis do after lazy var definition?

我正在分析一些第三方代码,有一个 "lazy" var 语句看起来像这样,我想了解 "computed property" 大括号后面的括号的作用:

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

"return .standardUserDefaults()"返回的是NSUserDefaults实例对象,为什么要在右花括号后面加一个()?

谢谢

表示是第一次访问defaults时执行的块。没有 () 意味着默认值是 () -> NSUserDefaults 类型变量的块类型。当您添加 () 时,这意味着它只是 NSUserDefaults,它由访问时执行的块返回。

我举了两个例子。第一个示例是您的典型 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

为了进一步说明,我 return 编辑了 num 并查看它是否在 SEC 中发生了变化。它没有。这意味着该块仅在第一次调用时运行,然后为自己分配 return 值。出于所有意图和目的,在第一次调用之后,MyNum 现在为 0,不再是一个块。

var num = 0
var myNum: Int = {
    print(num)
    return num
}()


print(myNum)
// 0
// 0
num += 1
print(myNum)
// 0