我的问题是如何处理属性方法的继承,例如set
,get
,didSet
,willSet
,......?
让我们举一个例子:我想覆盖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。
答案 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()