我希望避免编写不必要的代码。如果我为某个类型定义==
和<
,是否可以自动获取<=
(<
或==
),>
(不<
而非==
)或>=
(不是<
)?我认为Swift会免费提供这些操作符,但情况似乎并非如此。
答案 0 :(得分:1)
如果您的类型符合Equatable
,则会根据您的!=
提供==
的默认实施。
如果您的类型符合Comparable
,则会根据您的>
提供<=
,>=
和<
的默认实施。< / p>
请注意Comparable
扩展Equatable
,因此您还必须提供==
以符合Comparable
。
答案 1 :(得分:1)
是。这正是Comparable
协议的工作原理。您只需定义2个运算符:<
和==
。斯威夫特会弄明白其余的。
struct MyStruct : Comparable {
var value: Int
}
func == (lhs: MyStruct, rhs: MyStruct) -> Bool {
return lhs.value == rhs.value
}
func < (lhs: MyStruct, rhs: MyStruct) -> Bool {
return lhs.value < rhs.value
}
let a = MyStruct(value: 1)
let b = MyStruct(value: 42)
print(b > a) // We never defined `>` operator
答案 2 :(得分:0)
是
从Equatable
实施==
,从Comparable
实施<
,其他运营商将按预期使用默认实施。
要为自定义类型添加
Comparable
一致性,请将<
和==
运算符定义为类型的静态方法。==
运算符是Equatable
协议的要求,Comparable
扩展 - 请参阅该协议的文档以获取有关Swift中的相等性的更多信息。由于标准库提供了其余关系运算符的默认实现,因此您可以将!=
,>
,<=
和>=
与实例一起使用您的类型没有任何进一步的代码。