gpt4 book ai didi

swift - 在实例化期间如何访问属性(存储和计算)?

转载 作者:行者123 更新时间:2023-11-30 10:02:28 27 4
gpt4 key购买 nike

我正在参加 CS193 类(class)。从video的这一刻起.

选项 1:

class FaceView: UIView
{
var scale: CGFloat = 0.90
var mouthCurvature: Double = 1.0

private var skullRadius: CGFloat {
return min(bounds.size.width, bounds.size.height) / 2 * scale
}
}

为什么我写不了

选项 2:

class FaceView: UIView
{
var scale: CGFloat = 0.90
var mouthCurvature: Double = 1.0

private var skullRadius = min(bounds.size.width, bounds.size.height) / 2 * scale

}

教授解释说,在初始化期间,您无法访问自己的属性,因此如果您执行选项 2,您将收到一条错误消息:实例成员“bounds”不能在类型“FaceView”上使用'

好的,但是我们不是还在选项 1 中访问实例成员“bounds”吗?有什么不同?或者访问是可以的,但是您不能在初始化期间使一个属性依赖于另一个属性?

最佳答案

这是存储属性和计算属性之间的区别之一。

存储的属性 scalemouthCurvature 在实例化 FaceView 实例时初始化。

在您的第一个示例中,skullRadius 是一个计算属性,当您的 FaceView 实例在实例化后调用该属性时,就会计算该属性。

在第二个示例中,skullRadius 是一个在实例化时初始化的存储属性。其他属性此时尚不可用,因为它们可能已初始化,也可能未初始化。

以下是在初始化期间引用另一个属性的方法:

class test {
let foo = 1 // stored property
let bar = 2 // stored property
let buzz: Int // stored property not initialized when other stored properties are initialized
init() {
buzz = foo + bar // initialized after other stored properties
}
}

显示如何修改惰性属性的示例:

class Test {
lazy var foo: Int = { return 5 }()
}

let test = Test()
print(test.foo) -> "5"
test.foo = 10
print(test.foo) -> "10"

关于swift - 在实例化期间如何访问属性(存储和计算)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37684351/

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