微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – 每次访问时都会计算计算属性吗?

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

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

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

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

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

那不是计算属性.
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尝试将存储的闭包分配给属性.这将产生编译错误,因为该属性具有此类型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:让我们谈谈计算属性

所以我们明确表示这个问题中的代码不是计算属性.
但是,正如EmilioPelaez在下面的另一条评论中指出的那样,我们还应该声明每次访问计算属性时都会对其进行评估.

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

计算财产的例子(年龄)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐