[英]Inheritance of property methods (set, get, didSet, willSet, etc.) in Swift
我的問題是如何處理屬性方法的繼承,如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。
你可以這樣做:
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
類干凈。
不幸的是,你唯一的方法是創建一個單獨的get和set方法,如果你真的想這樣做的話。
class A {
private var value: Int = 0
func getValue() -> Int { return value }
func setValue(newValue : Int) {
value = newValue
}
}
根據使用計算屬性的性質,你基本上在某種程度上做了一個“快捷方式”而不是制作兩個單獨的方法 - 因此如果你想改變一些東西,你必須覆蓋set和get。
根據你的用法,覆蓋didSet
可以解決問題(基於你的上一個例子):
class B: A {
override var value: Int {
didSet {
_value++
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.