Swift虚拟运算符?

时间:2015-07-21 13:07:26

标签: swift oop

假设我们有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类。在这种情况下,我需要类似虚拟行为的东西。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

明确将您的班级定义为Equatable

extension Foo: Equatable {}

func ==(left: Foo, right: Foo) -> Bool {
  return awesomeEquatableLogic
}

答案 1 :(得分:2)

你应该使你的类符合Equatable协议:

class Foo: Equatable {
    ...
}

如果你不这样做,程序不知道如何检查相等性,它将使用默认实现。 一旦你这样做,它将使用custom == operator。