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

mal*_*ena 2 parentheses swift computed-properties

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

lazy var defaults:NSUserDefaults = {
    return .standardUserDefaults()
}()
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Xav*_*hia 6

我想出了两个例子。第一个例子是你的典型computed property。每次调用变量时它都会运行。

var num = 0
var myName: String {
    print(num)
    return "xxx"
}


print(myName)
// 0
// xxx
num += 1
print(myName)
// 1
// xxx
Run Code Online (Sandbox Code Playgroud)

第二个例子是一个self-executing closure. 正如您所看到的,它仅在第一次调用时运行 print(num) 。

var num = 0
var myName: String = {
    print(num)
    return "xxx"
}()


print(myName)
// 0
// xxx
num += 1
print(myName)
// xxx
Run Code Online (Sandbox Code Playgroud)

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

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


print(myNum)
// 0
// 0
num += 1
print(myNum)
// 0
Run Code Online (Sandbox Code Playgroud)


Pra*_*p K 5

这意味着访问了第一次执行默认值的块.没有()它意味着默认值是类型的变量的块类型() -> NSUserDefaults.添加()它意味着它只是NSUserDefaults访问时执行的块返回的内容.

  • 块末尾的()是块调用的指示符,而不是块本身. (2认同)
  • 我还是不完全理解它 - 它是一个闭包吗?它有详细解释吗?这个解释(似乎没问题)必须在Apple的快速文档中......我在哪里可以找到它?我想知道在一本优秀的Swift书中哪里可以找到它?我搜索了苹果书和其他书籍 - 但一无所获 (2认同)