class Base: Equatable {
static func == (lhs: Base, rhs: Base) -> Bool {
lhs.id == rhs.id
}
let id: String
init(id: String) {
self.id = id
}
}
class SubClass: Base {
public var id2: String?
public init(id1: String, id2: String? = nil) {
self.id2 = id2
super.init(id: id1)
}
static func == (lhs: SubClass, rhs: SubClass) -> Bool {
lhs.id2 == rhs.id2 && lhs.id == rhs.id
}
}print(a != b) // result: false
// Calls `Base` class's static func ==print(a == b) // result: false
// Calls `SubClass` class's static func ==我有一个简单的超类和子类,子类继承了Base并实现了static func ==。
当调用a != b时,它调用Base类的==实现而不是SubClass的==实现,为什么?但是当调用a == b时,它实际上调用了SubClass的==实现,为什么?
我预计!=和==都会调用SubClass的==实现。
发布于 2022-06-23 14:01:08
自从Swift语言(https://github.com/apple/swift-evolution/blob/master/proposals/0091-improving-operators-in-protocols.md)的改进以来,这个问题就已经存在很久了。
笔者也提到了这一问题。你可以检查一下。https://github.com/apple/swift-evolution/blob/master/proposals/0091-improving-operators-in-protocols.md#class-types-and-inheritance
我找到的解决方案之一是定义一个isEqual函数。
class Superclass: Equatable {
var foo: Int
init(foo: Int) {
self.foo = foo
}
func isEqual(to instance: Superclass) -> Bool {
return self.foo == instance.foo
}
static func ==(lhs: Superclass, rhs: Superclass) -> Bool {
return type(of: lhs) == type(of: rhs) && lhs.isEqual(to: rhs)
}
}
class Subclass: Superclass {
var bar: String
init(foo: Int, bar: String) {
self.bar = bar
super.init(foo: foo)
}
override func isEqual(to instance: Superclass) -> Bool {
guard let instance = instance as? Subclass else {
return false
}
return self.foo == instance.foo && self.bar == instance.bar
}
}
let a = Subclass(foo: 1, bar: "a")
let b = Subclass(foo: 1, bar: "b")
print(a == b) // False
print(a != b) // True参考资料:
https://stackoverflow.com/questions/72727479
复制相似问题