是否每次访问计算属性时都会对其进行评估?

时间:2016-01-28 15:34:29

标签: swift properties computed-properties

我有两个关于Swift计算属性的问题。

每次访问计算属性时都会对其进行评估吗?或者将它们存储在某处以供将来访问?

这是什么类型的财产,因为我无法谷歌出来:

let navigationController: UINavigationController = {
   var navigator = UINavigationController()
   navigator.navigationBar.translucent = false
   return navigator
}()

每次访问时都会评估它吗?

1 个答案:

答案 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"
    }
}

恕我直言,第一种方法更好,因为:

  • 它允许您在相同“空格”中声明和填充属性
  • 它更强烈清晰
  • 如果您有多个初始化程序,
  • 会阻止重复代码

注意#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:让我们谈谈计算属性

所以我们明确表示此问题中的代码 a Computed Property。 但是,正如 EmilioPelaez 在下面的另一条评论中所指出的那样,我们还应该说明Computed Property每次>被评估为

在下面的示例中,我创建了一个Computed Property age。正如您每次调用它时所看到的那样,块中的代码也会被执行。

计算属性的示例(age

enter image description here