Swift中属性方法(set、get、didSet、willSet等)的继承
我的问题是如何处理诸如set、get、didSet、willSet等属性方法的继承 让我们举一个例子:我想重写Swift类中属性的setter方法。以下是我想要实现的目标,但显然不起作用:Swift中属性方法(set、get、didSet、willSet等)的继承,swift,inheritance,properties,getter-setter,Swift,Inheritance,Properties,Getter Setter,我的问题是如何处理诸如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...
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应该被重写 不幸的是,如果您真的想这样做,那么唯一的方法就是创建一个单独的get-and-set方法
class A {
private var value: Int = 0
func getValue() -> Int { return value }
func setValue(newValue : Int) {
value = newValue
}
}
根据使用计算属性的性质,在某些方面,您基本上是在创建两个独立方法的基础上创建了一个快捷方式,因此,如果您想更改内容,您必须同时重写set和get。您可以:
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,但至少不需要_值,这有助于保持类a的干净。根据您的使用情况,对didSet的重写可以实现基于上一个示例的技巧:
class B: A {
override var value: Int {
didSet {
_value++
}
}
}
在您的第一个示例中,存储了baseclasses属性,而计算了子类1,它们必须是相同的类型才能执行任何重写操作。您是对的,这只是因为为了显示目标。@Kametrixom虽然您确实不能用存储的属性重写计算属性,但另一种方法是可能的。这使它更干净,但底层问题是:如何继承与属性相关的方法,例如get、set、willSet、…@MichaelDorner:我可能错了,但是超类中的var-value:Int=0是一个存储的属性,所以除非用@objc标记它,否则它没有可以继承的set/get方法。没错,这只是为了演示。第二个代码是带有计算属性的。但我删除了它以避免误解。如果子类的值字符串、Int等的类型不同怎么办。。。但是您希望能够根据它们从公共超类继承的事实来设置/获取值吗?