例如,有一个第一类
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)
}
}
}
继承班级:
public class SomeButton: SomeBaseButton {
override public var text: String? = "text"
override public var weight: Double = 2.0
}
所以,逻辑是SomeClass
定义自己的文本和权重。
但我收到了错误:
对于文字:“无法覆盖存储的属性'text'”
对于重量:“无法覆盖存储的属性'权重'”
答案 0 :(得分:52)
有趣的是,这在纯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实际上提供了更多信息。它显示以下两个错误:
吸气,体重"覆盖Objective-C方法" weight"来自超级" FooButton" 塞特为"体重"覆盖Objective-C方法" setWeight:"来自超级" Foobutton"
由于以下内容确实有效......
public class BarButton: FooButton {
override public var weight: Double {
get {
return 2.0
}
set {
// Do Nothing
}
}
}
...我的猜测是这些方法根本没有正确合成。
我想知道这是否是编译错误。或者是一个缺点。因为我认为可以处理案件。
也许Swift设计师认为如果覆盖weight
,您也可以在初始化程序中将其设置为不同的值。 HM。
答案 1 :(得分:8)
此外,如果有人想要覆盖属性以产生dynamic
效果,请参阅KVO
class MyClass: NSObject {
var date = NSDate()
}
class MyChildClass: MyClass {
dynamic override var date: NSDate {
get { return super.date }
set { super.date = newValue }
}
}
答案 2 :(得分:3)
在上面你有一个吸气剂和一个二传手。
当你覆盖它时,你只需要为它赋值。
而是如上所述设置setter和getter。
var _text:Text
override public var text: String? {
get {
return _text
}
set {
_text = newValue
}
}
答案 3 :(得分:1)
尝试覆盖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
//}
}
}