2015-12-05 64 views
2

我正在學習斯坦福大學課程,學習Swift語言。 在第五講中,有一個繪製笑臉的演示。爲什麼我必須使用計算屬性而不是存儲屬性來訪問convertPoint()

有一個faceCenter的聲明,代碼如下所示。

var faceCenter: CGPoint { 
    return convertPoint(center, fromView: superview) 
} 

但我的問題是爲什麼我可以使用簡單的平等像下面那樣?

var faceCenter: CGPoint = convertPoint(center, fromView: superview) 

當我做到了,系統給出此錯誤,「呼叫‘’額外的參數」 fromView。

誰能告訴我這個問題嗎?

回答

1

它不起作用,因爲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 
相關問題