swift: es correcto usar las properties almacenadas como properties computadas

Estoy tratando de lograr este código objective-c

@property (strong) UIView *customView; -(UIView*)customView { if (!customView){ self.customView = [[UIView alloc]init]; self.customView.backgroundColor = [UIColor blueColor]; } return customView; } 

¿Por qué uso esto? customView llamado desde muchos lugares, así que tenemos que verificar esta condición en todo lugar. Para evitar esta duplicación, escribí esto.

Así que trato de crear properties almacenadas y también uso el método getter para comprobar si ya se han creado o no.

 var mainView : UIView? { get{ if let customView = self.mainView{ return self.mainView } var customView : UIView = UIView() self.mainView = customView self.mainView.backgroundColor = UIColor(blueColor) return customView } set{ self.mainView = newValue } } 

¿Es esto correcto? o cualquier otro enfoque para hacer esto?

Nota: No hay ninguna advertencia o error con el código anterior. Pero confusión con las properties almacenadas y calculadas. Por favor, quede claro.

No estoy seguro de por qué, pero las variables perezosas combinadas con las properties calculadas dan como resultado un error:

 'lazy' attribute may not be used on a computed property 

Pero esto parece funcionar:

 class MyClass { @lazy var customView: NSView = { let view = NSView() // customize view return view }() } 

Esto se conoce como una propiedad perezosa. Simplemente declararlo como cualquier otra propiedad almacenada pero con el modificador @lazy . El object se creará cuando alguien intente getlo. No necesitas escribir eso por ti mismo.

Vea 'Propiedades almacenadas perezosas' en el libro Swift . Solo escribirías:

 @lazy var customView = UIView() 

El equivalente debería ser el siguiente en swift 2.1:

 var _customView:UIView? = nil var customView:UIView { if _customView == nil { _customView = UIView.init() _customView?.backgroundColor = UIColor.blueColor() } return _customView! } 

Además, escribiré su código objective original C como el siguiente para evitar llamar al getter de customView varias veces:

 @property (strong) UIView *customView; // @synthesize customView; // make sure you didn't add this line - (UIView*)customView { if (!_customView){ _customView = [[UIView alloc] init]; _customView.backgroundColor = [UIColor blueColor]; } return customView; }