惰性变量定义后括号做啥?
Posted
技术标签:
【中文标题】惰性变量定义后括号做啥?【英文标题】:what do parenthesis do after lazy var definition?惰性变量定义后括号做什么? 【发布时间】:2016-05-16 05:38:36 【问题描述】:我正在分析一些第三方代码,并且有一个看起来像这样的“惰性” var 语句,我想了解括号在“计算属性”花括号之后的作用:
lazy var defaults:NSUserDefaults =
return .standardUserDefaults()
()
"return .standardUserDefaults()" 是返回 NSUserDefaults 实例对象,为什么要在右大括号后面加一个 ()?
谢谢
【问题讨论】:
【参考方案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(num)
return num
()
print(myNum)
// 0
// 0
num += 1
print(myNum)
// 0
【讨论】:
感谢清晰的解释!你知道这是否是线程安全的吗?【参考方案2】:这意味着它是第一次访问默认值时执行的块。如果没有()
,则意味着默认值是() -> NSUserDefaults
类型的变量块类型。当您添加()
时,这意味着它只是在访问时执行的块返回的NSUserDefaults
。
【讨论】:
谢谢,是的,这很有道理。令我困惑的是,花括号使它看起来像没有 get 的“计算属性”。编译器如何知道它不是计算属性,而是块/闭包? 块末尾的 () 表示它是块调用,而不是块本身。 我还是没完全理解——是闭包吗?有详细的解释吗?这个解释(看起来不错)必须在 Apple 的 swift-documentation 中......我在哪里可以找到它?我还想知道在一本好的 Swift 书中哪里可以找到它?我搜索了 Apple book 和其他书籍 - 但一无所获以上是关于惰性变量定义后括号做啥?的主要内容,如果未能解决你的问题,请参考以下文章