【发布时间】:2017-02-16 00:20:13
【问题描述】:
我正在尝试在 Swift 3 中的基类及其子类中实现 == 运算符(来自 Equatable)。所有类都只会在 Swift 中使用,所以我不想涉及 @987654323 @ 或 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
}
}
但这会导致错误:
运算符函数覆盖“最终”运算符函数
好的。经过一番研究(仍在学习 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
}
}
但这会导致一个新的错误:
在非最终类 'Base' 中声明的运算符 '==' 必须是 'final'
呃。这比应有的复杂得多。
如何在基类和子类中正确实现Equatable 协议和== 运算符?
【问题讨论】:
标签: swift subclass swift3 equatable