假设我们有Foo类:
class Foo {
// some variables
}
我们有类Foo的==运算符:
func ==(left: Foo, right: Foo) -> Bool {
return left.X == right.X && left.Y == right.Y && etc.
}
然后我们想在一些通用函数中使用它
class func mergeUnique<T: Equatable>(workaround: T) -> ((data: [T], newData: [T]) -> [T]) {
return { (data: [T], newData: [T]) in
var res = data
for newElem in newData {
var duplicate = false
for oldElem in res {
if oldElem == newElem {
duplicate = true
break
}
}
if !duplicate {
res.append(newElem)
}
}
return res
}
}
问题是==运算符实际上是一个全局作用域函数,而不是类方法(因为我们可以在C ++中这样做),所以当函数接收Equatable对象时,它使用Equatable协议的==运算符,而不是==运算符Foo类。在这种情况下,我需要类似虚拟行为的东西。有什么想法吗?
答案 0 :(得分:2)
明确将您的班级定义为Equatable
extension Foo: Equatable {}
func ==(left: Foo, right: Foo) -> Bool {
return awesomeEquatableLogic
}
答案 1 :(得分:2)
你应该使你的类符合Equatable协议:
class Foo: Equatable {
...
}
如果你不这样做,程序不知道如何检查相等性,它将使用默认实现。 一旦你这样做,它将使用custom == operator。