我试图在基类中实现==
运算符(从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让我们做的吗? –