在swift中覆盖属性

Vas*_*mil 35 properties ios 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并继承了类:

public class SomeButton: SomeBaseButton {

    override public var text: String? = "text"
    override public var weight: Double = 2.0
}
Run Code Online (Sandbox Code Playgroud)

所以,逻辑是SomeClass定义自己的文本和权重.但是我收到了错误:

对于文本:" 无法覆盖存储的属性'文本' "

对于重量:" 不能覆盖存储的属性'权重' "

Ste*_*ntz 53

有趣的是,这在纯Swift类中运行得很好.例如,这可以按预期工作:

public class FooButton {
    public var weight: Double = 1.0
}

public class BarButton: FooButton {
    override public var weight: Double = 2.0
}
Run Code Online (Sandbox Code Playgroud)

它不适合你的原因是因为你正在使用Objective-C类:因为它UIButton是一个Objective-C类,它的所有子类也都是.因此,规则似乎有点不同.

Xcode 6.3实际上提供了更多信息.它显示以下两个错误:

Getter for"weight"覆盖Objective-C方法"权重"来自超类"FooButton"Setter for"weight"覆盖Objective-C方法"setWeight:"来自超类"Foobutton"

由于以下工作...

public class BarButton: FooButton {
    override public var weight: Double {
        get {
            return 2.0
        }
        set {
            // Do Nothing
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...我的猜测是这些方法根本没有正确合成.

我想知道这是否是编译错误.或者是一个缺点.因为我认为它可以处理这个案子.

也许Swift设计师认为在覆盖的情况下weight你也可以简单地在初始化器中将其设置为不同的值.嗯.

  • 此解决方案在**Swift 4**中不起作用. (17认同)
  • 对我来说,你的第一个例子没有编译.不是Xcode 6.3.2(Swift 1.2),也不是Xcode 7.0 beta(Swift 2.0).只是抛出编译器错误:"无法覆盖存储的属性权重" (10认同)
  • 更简单:`覆盖公共变量权重:双{返回2.0}` (4认同)

onm*_*133 9

此外,如果有人想要覆盖属性才能dynamic生效,请参阅KVO

class MyClass: NSObject {
    var date = NSDate()
}

class MyChildClass: MyClass {
    dynamic override var date: NSDate {
        get { return super.date }
        set { super.date = newValue }
    }
}
Run Code Online (Sandbox Code Playgroud)