【发布时间】:2015-07-21 13:07:26
【问题描述】:
假设我们有 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 协议的 == 运算符,而不是 Equatable 协议的 == 运算符福班。在这种情况下,我需要类似虚拟行为的东西。有什么想法吗?
【问题讨论】:
-
你有没有尝试让你的班级平等:class Foo: Equatable ?