【发布时间】:2016-06-07 16:12:36
【问题描述】:
我正在学习 CS193 课程。从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”吗?有什么不同?或者是访问是可以的,但是你不能让一个属性依赖于另一个在初始化期间?
【问题讨论】:
-
不同之处在于您何时访问它。在选项 2 中,faceview 尚未实例化,因此它没有边界
-
我想我无法将我的问题传达给你,我已经知道了......它是如何在选项 1 中被视为实例化的?我们在那里做什么不同?只需
returning 并解决问题对我来说并不神秘...... -
scale和mouthCurvature在FaceView的实例被实例化时被初始化。您的计算属性skullRadius是在实例化对象在实例化之后调用该属性时计算的。在另一种情况下,skullRadius是常规属性,它是在实例化时设置的,因此其他成员尚不可用。
标签: swift initialization cs193p