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
我正在分析一些第三方代码,有一个 "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