为Swift中的重载比较运算符提供最小的实现

时间:2014-09-15 16:04:06

标签: swift

今天早上我正在思考如何在Swift中正确实现比较运算符。我有一个类(一个非常轻量级的日期类),我已经重载了相等运算符:

func == (lhs: SimpleDate, rhs: SimpleDate) -> Bool {
    if (lhs.day != rhs.day) {
        return false
    }
    if (lhs.month != rhs.month) {
        return false
    }
    if (lhs.year != rhs.year) {
        return false
    }
    return true
}

但我现在也希望能够使用><>=<=。在提供此功能时,是否需要编写所有4个函数?

接下来,对于>=,您可以在已经编写的== || >组合的基础上构建,但我想知道如果Swift看到这个功能是否有任何方法可以自动确定==>都已实施。

即。有没有办法,而不是在我的类中编写这5个全局范围的函数,覆盖一个允许我返回NSComparisonResult或类似的特殊函数/运算符,并自动让Swift为我过载所有这些操作符?

1 个答案:

答案 0 :(得分:4)

答案在"Swift Standard Library Reference"

中给出
  

Equatable

     

Equatable协议可以确定是否有两个   相同类型的值被认为是相等的。

     

协议中定义了一个必需的运算符重载:==。

     

Comparable

     

Comparable协议可以比较两个   相同类型的值。

     

协议中定义了一个必需的运算符重载(&lt;),   以及在继承的Equatable协议(==)中定义的一个。通过   采用Comparable协议并为其添加运算符重载   &lt;,您自动获得使用&gt;,&lt; =和&gt; =的能力。

因此,您的班级符合Comparable==就足够了 并实施了<个运营商:

class SimpleDate : Comparable {
    // ...
}

func == (lhs: SimpleDate, rhs: SimpleDate) -> Bool {
    // ...
}

func < (lhs: SimpleDate, rhs: SimpleDate) -> Bool {
    // ...
}

然后提供剩余的比较运算符!=><=>= 通用库方法。