6

I am analyzing analyzing some third party code and there is a "lazy" var statement that looks like this, and I would like to understand what the parenthesis are doing after the "computed property" curly braces:

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

The "return .standardUserDefaults()" is returning the NSUserDefaults instance object, so why add a () after the right curly brace?

thanks

4

2 回答 2

13

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

于 2016-02-06T05:46:00.643 回答
4

我想出了两个例子。第一个示例是您的典型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(num)
    return num
}()


print(myNum)
// 0
// 0
num += 1
print(myNum)
// 0
于 2021-07-05T04:26:13.413 回答