Я пытаюсь реализовать оператор ==
(из 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
и ==
правильно в базовом классе и подклассе?