Я пытаюсь реализовать оператор == (из Equatable) в базовом классе и его подклассах в Swift 3. Все классы будут использоваться только в Swift, поэтому я не хочу включать NSObject или NSCopying.
Я начал с базового класса и подкласса:
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
}
}
Но это приводит к ошибке:
Операторная функция переопределяет "конечную" операторную функцию
OK. После некоторых исследований (все еще изучая Swift 3) я узнаю, что static можно заменить на class, чтобы указать, что метод типа может быть переопределен.
Итак, я пытаюсь изменить static на class в Base:
class Base : Equatable {
var x : Int
class func == (lhs: Base, rhs: Base) -> Bool {
return lhs.x == rhs.x
}
}
Но это приводит к новой ошибке:
Оператор '==', объявленный в непределом классе Base, должен быть "final"
Тьфу. Это гораздо сложнее, чем должно быть.
Как реализовать протокол Equatable и == правильно в базовом классе и подклассе?