我有两个关于Swift计算属性的问题。
每次访问计算属性时都会对其进行评估吗?或者将它们存储在某处以供将来访问?
这是什么类型的财产,因为我无法谷歌出来:
let navigationController: UINavigationController = {
var navigator = UINavigationController()
navigator.navigationBar.translucent = false
return navigator
}()
每次访问时都会评估它吗?
答案 0 :(得分:13)
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"
}
}
恕我直言,第一种方法更好,因为:
如下面的评论中提到的 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
所以我们明确表示此问题中的代码不 a Computed Property
。
但是,正如 EmilioPelaez 在下面的另一条评论中所指出的那样,我们还应该说明Computed Property
每次>>被评估为 。
在下面的示例中,我创建了一个Computed Property age
。正如您每次调用它时所看到的那样,块中的代码也会被执行。
计算属性的示例(age
)