2017-03-28 2 views
-1

vor.wundernde Verwendung der berechneten Eigenschaft

class DrawingView: UIView { 

    var arcCenter = CGPoint(x: frame.midX, y: frame.midY) // error 
} 

nach.

class DrawingView: UIView { 

    var arcCenter: CGPoint { 
     return CGPoint(x: frame.midX, y: frame.midY) 
    } 
} 

Ich weiß, warum dieser Fehler auftritt, aber ich kann nicht verstehen, warum die zweiten Codes keinen Fehler machen.

Antwort

0

Die erste Form ist nicht eine berechnete Eigenschaft.

Es ist eine gespeicherte Eigenschaft mit einem Standardwert.

es verwendet self, die den Fehler verursacht, da im Moment der Standardwert zugeordnet wird die Instanz nicht garantiert, instanziiert werden.

Eine Alternative zu einer berechneten Eigenschaft - die berechnet wird nur im Moment der es heißt - ist eine faule instanziierte Eigenschaft.

lazy var arcCenter: CGPoint = CGPoint(x: self.frame.midX, y: self.frame.midY) 

Im Gegensatz zu der gespeichert Eigenschaft des Standardwert zugewiesen wird, wenn die Eigenschaft zum ersten Mal zugegriffen wird.

+0

keine Notwendigkeit, einen Verschluss zu verwenden. 'Lazy var arcCenter: CGPoint = CGPoint (x: selbst.frame.midX, y: self.frame.midY)' –

+1

@LeoDabus Richtig, danke. – vadian

Verwandte Themen