在swift中覆盖属性

时间:2015-02-28 20:36:10

标签: ios swift properties

例如,有一个第一类

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'

对于重量:“无法覆盖存储的属性'权重'

4 个答案:

答案 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

        //}
    }

}