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

How properties( stored and computed) are accessed during instantiation?

我正在上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,您将收到一条错误消息:instance member 'bounds' cannot be used on type '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"