Swift 虚拟运算符?

Posted

技术标签:

【中文标题】Swift 虚拟运算符?【英文标题】:Swift virtual operator? 【发布时间】: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 ? 【参考方案1】:

将你的类明确定义为Equatable

extension Foo: Equatable 

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

【讨论】:

太棒了。只需在操作员实施之前添加public,现在一切正常。对我来说不是很清楚的行为(与 C++ 相比)。谢谢 据我了解,您可以认为 swift 默认具有虚拟方法。 C++ 的特殊性在于它总是尝试进行静态调度(在编译时完成,因此需要将方法标记为virtual),而大多数其他面向对象的语言在运行时处理消息传递。 是的,C++ 理念是“无开销”,因此默认方法是非虚拟的,但标记为虚拟的方法的行为与 Java 或 C# 中的方法完全相同。我不清楚的部分是 swift 中的 == 函数不是方法(我的意思是不是成员函数)。但事实上它展示了虚拟行为并且像方法一样工作。【参考方案2】:

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

class Foo: Equatable 
    ...

如果您不这样做,程序将不知道如何检查是否相等,它将使用默认实现。 一旦你这样做,它将使用自定义 == 运算符。

【讨论】:

以上是关于Swift 虚拟运算符?的主要内容,如果未能解决你的问题,请参考以下文章

Swift基本运算符

swift运算符使用_02_swift基本数据类型

swift Swift null合并运算符

Swift3.0-基本运算符

swift swift中的关联附加运算符

Swift 高级运算符