property mutating lazy computed ios swift properties

ios - mutating - Propiedades superiores en veloz



swift methods (4)

Por ejemplo, a tener una primera clase

public class MyBaseButton: UIButton { public var weight: Double = 1.0 public var text: String? { get { return self.titleForState(.Normal) } set { return self.setTitle(newValue, forState: .Normal) } } }

Y clase heredada:

public class SomeButton: SomeBaseButton { override public var text: String? = "text" override public var weight: Double = 2.0 }

Entonces, la lógica es que SomeClass define el texto y el peso propios. Pero estoy recibiendo un error:

Para texto : " No se puede anular con una propiedad almacenada ''texto'' "

Para peso : " No se puede anular con una propiedad almacenada ''peso'' "


Además, si alguien quiere anular la propiedad para tener dynamic efecto dynamic , vea KVO

class MyClass: NSObject { var date = NSDate() } class MyChildClass: MyClass { dynamic override var date: NSDate { get { return super.date } set { super.date = newValue } } }


Curiosamente, esto funciona bien en clases puras de Swift. Por ejemplo, esto funciona como se esperaba:

public class FooButton { public var weight: Double = 1.0 } public class BarButton: FooButton { override public var weight: Double = 2.0 }

La razón por la cual no funciona para usted es porque está trabajando con clases Objective-C: dado que UIButton es una clase Objective-C, todas sus subclases también lo serán. Debido a eso, las reglas parecen ser un poco diferentes.

Xcode 6.3 es en realidad un poco más informativo. Muestra los siguientes dos errores:

Getter para "peso" anula el método Objective-C "peso" de la superclase "FooButton" Setter para "peso" anula el método Objective-C "setWeight:" de la superclase "Foobutton"

Como lo siguiente funciona ...

public class BarButton: FooButton { override public var weight: Double { get { return 2.0 } set { // Do Nothing } } }

... supongo que estos métodos simplemente no se sintetizan correctamente.

Me pregunto si esto es un error del compilador. O una deficiencia. Porque creo que podría manejar el caso.

Tal vez los diseñadores de Swift pensaban que, en caso de anulación de weight , también podría establecerlo en un valor diferente en su inicializador. Hm.


En lo anterior, tienes un getter y un setter.

Cuando lo anula, solo le está asignando un valor.

En lugar de eso, configura el setter y getter como lo has hecho anteriormente.

var _text:Text override public var text: String? { get { return _text } set { _text = newValue } }


Me encontré con este problema al intentar anular la propiedad NSPredicateRowEditor templateViews en Swift 3.

Propiedad de superclase para anular:

open var templateViews: [NSView] { get }

Anular como tal:

class CustomRowTemplate: NSPredicateEditorRowTemplate { override var templateViews: [NSView] { get { let templateViews = super.templateViews // custom subclass work goes here return templateViews } //set { // Superclass property is `get` only, other properties might need a setter //} } }