Swift是否支持自动生成运营商?

时间:2017-02-07 02:33:53

标签: swift swift3

我希望避免编写不必要的代码。如果我为某个类型定义==<,是否可以自动获取<=<==),>(不<而非==)或>=(不是<)?我认为Swift会免费提供这些操作符,但情况似乎并非如此。

3 个答案:

答案 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中的相等性的更多信息。由于标准库提供了其余关系运算符的默认实现,因此您可以将!=><=>=与实例一起使用您的类型没有任何进一步的代码。