我試圖在基類中實現==
運算符(從Equatable
),並且它的子類在Swift 3中。所有類將只在Swift中使用,所以我不想涉及NSObject
或NSCopying
協議。如何在類層次結構中正確實現Equatable協議?
我開始用一個基類和子類:
class Base {
var x : Int
}
class Subclass : Base {
var y : String
}
現在我想添加Equatable
和==
運營商Base
。看起來很簡單。從文檔複製==
運營商簽名:
class Base : Equatable {
var x : Int
static func == (lhs: Base, rhs: Base) -> Bool {
return lhs.x == rhs.x
}
}
到目前爲止這麼好。現在的子類:
class Subclass : Base {
static override func == (lhs: Base, rhs: Base) -> Bool {
return true
}
}
但是,這將導致一個錯誤:
Operator function overrides a 'final' operator function
確定。經過一番研究(仍然在學習Swift 3),我知道static
可以替換爲class
來指示類型方法可以被覆蓋。
所以我試圖在Base
改變static
到class
:
class Base : Equatable {
var x : Int
class func == (lhs: Base, rhs: Base) -> Bool {
return lhs.x == rhs.x
}
}
但是,這將導致新的錯誤:
Operator '==' declared in non-final class 'Base' must be 'final'
唉。這遠比它應該更復雜。
如何在基類和子類中正確實現Equatable
協議和==
運算符?
哇。巧妙的解決方法,但這真的是Swift讓我們做的嗎? –