这不是计算属性。
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 尝试将 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 在下面的另一条评论中指出的那样,我们还应该声明Computed Property每次被访问时都会被评估。
在下面的示例中,我创建了一个计算属性age。正如你所看到的,每次我调用它时,块中的代码也会被执行。
计算属性示例 (age)