簡體   English   中英

在Swift中繼承屬性方法(set,get,didSet,willSet等)

[英]Inheritance of property methods (set, get, didSet, willSet, etc.) in Swift

我的問題是如何處理屬性方法的繼承,如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。

你可以這樣做:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM