I'm trying to implement the ==
operator (from Equatable
) in a base class and its subclasses in Swift 3. All of the classes will only be used in Swift so I do not want to involve NSObject
or the NSCopying
protocol.
I started with a base class and a subclass:
class Base {
var x : Int
}
class Subclass : Base {
var y : String
}
Now I wanted to add Equatable
and the ==
operator to Base
. Seems simple enough. Copy the ==
operator signature from the documentation:
class Base : Equatable {
var x : Int
static func == (lhs: Base, rhs: Base) -> Bool {
return lhs.x == rhs.x
}
}
So far so good. Now for the subclass:
class Subclass : Base {
static override func == (lhs: Base, rhs: Base) -> Bool {
return true
}
}
But this results in an error:
Operator function overrides a 'final' operator function
OK. After some research (still learning Swift 3) I learn that static
can be replaced with class
to indicate the type method can be overridden.
So I attempt to change static
to class
in Base
:
class Base : Equatable {
var x : Int
class func == (lhs: Base, rhs: Base) -> Bool {
return lhs.x == rhs.x
}
}
But that results in a new error:
Operator '==' declared in non-final class 'Base' must be 'final'
Ugh. This is far more complicated than it should be.
How do I implement the Equatable
protocol and the ==
operator properly in a base class and a subclass?