我试图在基类中实现==操作符(来自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
}
}但这会导致一个错误:
运算符函数覆盖“最终”运算符函数。
好的。经过一些研究(还在学习Swift 3),我了解到可以用static替换class,以指示可以重写类型方法。
因此,我尝试将static更改为class in Base
class Base : Equatable {
var x : Int
class func == (lhs: Base, rhs: Base) -> Bool {
return lhs.x == rhs.x
}
}但这导致了一个新的错误:
非最终类'Base‘中声明的运算符'==’必须是'final‘。
呃。这比应该要复杂得多。
如何在基类和子类中正确地实现Equatable协议和==操作符?
发布于 2018-05-24 01:32:49
在rmaddy's answer之后,我提出了一种测试等式的防护方法:
Base.swift
static func ==(lhs: Base, rhs: Base) -> Bool {
// ensure class properties match
guard lhs.x == rhs.x else {
return false
}
return true
}Subclass.swift
static func ==(lhs: Subclass, rhs: Subclass) -> Bool {
// ensure base class properties match
guard lhs as Base == rhs as Base else {
return false
}
// ensure class properties match
guard lhs.y == rhs.y else {
return false
}
return true
}https://stackoverflow.com/questions/39909805
复制相似问题