gpt4 book ai didi

swift - 每次访问计算属性时都会对其进行评估吗?

转载 作者:搜寻专家 更新时间:2023-10-30 22:25:13 25 4
gpt4 key购买 nike

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

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

这是什么样的属性(property),因为我无法用谷歌搜索:

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

该 block 在实例化类的实例时执行。只有一次。

所以写这个

struct Person {
let name: String = {
let name = "Bob"
return name
}() // <- look at these
}

等同于

struct Person {
let name: String
init() {
self.name = "Bob"
}
}

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

  • 它允许您在相同的“空间”
  • 中声明和填充属性
  • 清晰
  • 如果您有多个初始化程序,确实可以防止重复代码

注意#1:在属性中存储闭包

正如 dfri 在下面的评论中指出的那样,代码块确实以 () 结尾。这意味着代码被求值并将结果分配给属性。

另一方面,如果我们删除 block 末尾的 (),我们会得到一些不同的东西,事实上 block 是评估的。在这种情况下,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 每次被访问时都会被评估。

在下面的示例中,我创建了一个计算属性 age。正如您所看到的,每次我调用它时, block 中的代码也会被执行。

计算属性示例(age)

enter image description here

关于swift - 每次访问计算属性时都会对其进行评估吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35065649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com