那不是计算属性。
let navigationController: UINavigationController = {
var navigator = UINavigationController()
navigator.navigationBar.translucent = false
return navigator
}()
它只是一个存储属性,填充了此代码块返回的值的结果。
var navigator = UINavigationController()
navigator.navigationBar.translucent = false
return navigator
该块在类的实例被实例化时执行。只有一次。
所以写这个
struct Person {
let name: String = {
let name = "Bob"
return name
}() // <- look at these
}
相当于这个_
struct Person {
let name: String
init() {
self.name = "Bob"
}
}
恕我直言,第一种方法更好,因为:
- 它确实允许您在同一个“空间”中声明和填充属性
- 更清楚
- 如果您有多个初始化程序,确实可以防止代码重复
注意#1:在属性中存储闭包
正如dfri在下面的评论中指出的那样,代码块确实以()
. 这意味着对代码进行评估并将结果分配给属性。
另一方面,如果我们删除()
块末尾的 ,我们会得到不同的东西,实际上该块没有被评估。在这种情况下,Swift 尝试将 a 分配stored closure
给该属性。这将产生一个编译错误,因为该属性具有这种类型UINavigationController
。
使用正确的语法,我们可以在属性中放置一个闭包。
struct Person {
let sayHello: ()->() = { print("Hello") }
}
现在我们有一个sayHello
包含闭包的属性。闭包接收 0 个参数并返回Void
。
let bob = Person()
bob.sayHello // this does NOT execute the code inside closure
bob.sayHello() // this does execute the code in the closure and does print the message
注意#2:让我们谈谈计算属性
所以我们明确表示这个问题中的代码不是Computed Property
. 但是,正如EmilioPelaez在下面的另一条评论中指出的那样,我们还应该声明 a在每次Computed Property
访问时都会对其进行评估。
在下面的示例中,我创建了一个 Computed Property age
。正如您所看到的,每次我调用它时,块中的代码也会被执行。
计算属性示例 ( age
)