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
//}
}
}