它不起作用,因爲self
尚未初始化。每個值必須在self
可用之前分配。
它實際上是試圖用自己三次:
var faceCenter: CGPoint = self.convertPoint(self.center, fromView: self.superview)
不幸的是,編譯器不符合這個錯誤真的很有幫助。
您可以隨時將其設置爲可選項或將其設置爲默認值。然後在init方法中給它正確的值。
可以在創建stored property
的同時訪問self
,而不需要在init方法中分配值。這涉及faceCenterBeta
中的方法。它是用lazy
聲明爲它分配一個值,當它第一次被讀取,而不是當對象被初始化時。它還使用closure
而不是getter
來獲取該值。
class Test : UIView {
var faceCenter : CGPoint = CGPointZero // give a default value, give correct value in the init method
var faceCenterAlpha: CGPoint { // getter
print("getter")
return convertPoint(center, fromView: superview)
}
lazy var faceCenterBeta: CGPoint = { [unowned self] in // closure
print("closure")
return self.convertPoint(self.center, fromView: self.superview)
}()
func faceCenterDelta() -> CGPoint { // good ol' function
print("function")
return convertPoint(center, fromView: superview)
}
init() {
super.init(frame: CGRectZero)
faceCenter = convertPoint(center, fromView: superview)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
let test = Test()
// executed every time, just like a function
test.faceCenterAlpha
test.faceCenterAlpha
test.faceCenterAlpha
// only executed once
test.faceCenterBeta
test.faceCenterBeta
test.faceCenterBeta