在swift中重写属性
例如有一个第一类
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) } } }
和inheritance的类:
public class SomeButton: SomeBaseButton { override public var text: String? = "text" override public var weight: Double = 2.0 }
所以,逻辑是SomeClass
定义自己的文本和权重。 但是我得到一个错误:
对于文本 :“ 不能用存储的属性覆盖”文本“ ”
对于重量 :“ 不能用存储属性重量”重量“ ”
有趣的是,这在纯Swift类中工作得很好。 例如,这按预期工作:
public class FooButton { public var weight: Double = 1.0 } public class BarButton: FooButton { override public var weight: Double = 2.0 }
它不适合你的原因是因为你正在使用Objective-C类:因为UIButton
是一个Objective-C类,它的所有子类也是如此。 正因为如此,规则似乎有点不同。
Xcode 6.3实际上是更多的信息。 它显示了以下两个错误:
用于“权重”的Getter覆盖从超类“FooButton”的Objective-C方法“权重”用于“权重”的Setter覆盖Objective-C方法“setWeight:”from superclass“Foobutton”
由于以下工作…
public class BarButton: FooButton { override public var weight: Double { get { return 2.0 } set { // Do Nothing } } }
…我的猜测是这些方法不能正确合成。
我不知道这是否是一个编译器错误。 还是一个缺点。 因为我认为它可以处理这个案子。
也许Swift的devise者认为,如果压倒性的weight
你也可以简单地将它设置为初始值设定项中的不同值。 嗯。
另外,如果有人想重写属性来产生dynamic
效果,请参阅KVO
class MyClass: NSObject { var date = NSDate() } class MyChildClass: MyClass { dynamic override var date: NSDate { get { return super.date } set { super.date = newValue } } }
在上面你有一个getter和一个setter。
当你覆盖它,你只是分配一个值。
而是像上面那样设置setter和getter。
var _text:Text override public var text: String? { get { return _text } set { _text = newValue } }
我试图覆盖Swift 3中的NSPredicateRowEditor templateViews
属性时遇到了这个问题。
要覆盖的超类属性:
open var templateViews: [NSView] { get }
重写像这样:
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 //} } }