9

我对 Swift 中的计算属性有两个问题。

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

这是什么样的财产,因为我无法谷歌它:

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

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

4

1 回答 1

18

那不是计算属性。

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)

在此处输入图像描述

于 2016-01-28T15:37:28.677 回答