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