今天早上我正在思考如何在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为我过载所有这些操作符?
答案 0 :(得分:4)
答案在"Swift Standard Library Reference":
中给出Equatable协议可以确定是否有两个 相同类型的值被认为是相等的。
协议中定义了一个必需的运算符重载:==。
Comparable协议可以比较两个 相同类型的值。
协议中定义了一个必需的运算符重载(&lt;), 以及在继承的Equatable协议(==)中定义的一个。通过 采用Comparable协议并为其添加运算符重载 &lt;,您自动获得使用&gt;,&lt; =和&gt; =的能力。
因此,您的班级符合Comparable
和==
就足够了
并实施了<
个运营商:
class SimpleDate : Comparable {
// ...
}
func == (lhs: SimpleDate, rhs: SimpleDate) -> Bool {
// ...
}
func < (lhs: SimpleDate, rhs: SimpleDate) -> Bool {
// ...
}
然后提供剩余的比较运算符!=
,>
,<=
和>=
通用库方法。