在Swift中继承属性方法(set,get,didSet,willSet等)

时间:2015-09-07 10:06:39

标签: swift inheritance properties getter-setter

我的问题是如何处理属性方法的继承,例如setgetdidSetwillSet,......?

让我们举一个例子:我想覆盖Swift类中属性的setter方法。这是我想要实现的目标(显然不起作用):

class A {
    var value: Int {get {...} set {...} }
}

class B: A {
    var value: Int {
        set(newValue) {
            // do some fancy stuff...
        }
    }
}

这也不起作用:

// in class B
override func setValue(newValue: Int) {
    // do some fancy stuff...
}

我们可以在Swift中做到这样的事情:

class A {
    var _value: Int = 0
    var value: Int {
        get {
            return _value
        }
        set {
            _value = newValue
        }
    }
}

class B: A {
    override var value: Int {
        get {
            return _value
        }
        set {
            _value = newValue + 1
        }
    }
}

let a = A()
a.value = 1
print(a.value) // => 1

let b = B()
b.value = 1 
print(b.value) // => 2

这种方法不是很优雅,因为我还必须实现getter方法,这实际上并不是必需的,因为只应覆盖setter。

3 个答案:

答案 0 :(得分:3)

你可以这样做:

class A {
    var value: Int = 0
}

class B: A {
    override var value: Int {
        get { return super.value }
        set {
            // Something fancy...
            super.value = newValue
        }
    }
}

虽然你仍然需要在B中实施一个getter,但至少你不需要_value,这有助于保持课程A的清洁。

答案 1 :(得分:0)

不幸的是,如果您真的想要这样做,那么唯一的方法就是创建一个单独的get和set方法。

class A {
  private var value: Int = 0

 func getValue() -> Int { return value }
 func setValue(newValue : Int) {
   value = newValue
 }
}

根据使用计算属性的性质,您基本上是在做一个"快捷方式"在某些方面,而不是制作两个单独的方法 - 因此,如果你想改变一些东西,你必须覆盖set和get。

答案 2 :(得分:0)

根据您的使用情况,覆盖more_tasks可以解决问题(基于您的上一个示例):

read_shlib()