Я пытаюсь реализовать оператор ==
(от 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
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
}
}
Но это приводит к новой ошибке:
Operator '==' declared in non-final class 'Base' must be 'final'
тьфу. Это гораздо сложнее, чем должно быть.
Как реализовать протокол Equatable
и оператор ==
в базовом классе и подклассе?
Wow. Умный обход, но разве это ДЕЙСТВИТЕЛЬНО то, что Стрит делает нас? –