在实例化期间如何访问属性(存储和计算)?
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”吗?有什么不同?还是说访问是可以的,但是在初始化的时候不能让一个属性依赖另一个?
这是存储属性和计算属性之间的差异之一。
存储的属性 scale
和 mouthCurvature
在实例化 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"
我正在上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”吗?有什么不同?还是说访问是可以的,但是在初始化的时候不能让一个属性依赖另一个?
这是存储属性和计算属性之间的差异之一。
存储的属性 scale
和 mouthCurvature
在实例化 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"