如何在Swift 4中测试具有关联值的枚举情况的等效性

时间:2017-10-17 03:45:43

标签: swift enums operators equality swift4

我想测试几个枚举类型变量的等价性,如:

enum AnEnumeration {
  case aSimpleCase
  case anotherSimpleCase
  case aMoreComplexCase(String)
}

let a1 = AnEnumeration.aSimpleCase
let b1 = AnEnumeration.aSimpleCase
a1 == b1 // Should be true.

let a2 = AnEnumeration.aSimpleCase
let b2 = AnEnumeration.anotherSimpleCase
a2 == b2 // Should be false.

let a3 = AnEnumeration.aMoreComplexCase("Hello")
let b3 = AnEnumeration.aMoreComplexCase("Hello")
a3 == b3 // Should be true.

let a4 = AnEnumeration.aMoreComplexCase("Hello")
let b4 = AnEnumeration.aMoreComplexCase("World")
a3 == b3 // Should be false.

可悲的是,这些都会产生这样的错误:

error: MyPlayground.playground:7:4: error: binary operator '==' cannot be applied to two 'AnEnumeration' operands
a1 == b1 // Should be true.
~~ ^  ~~

MyPlayground.playground:7:4: note: binary operator '==' cannot be synthesized for enums with associated values
a1 == b1 // Should be true.
~~ ^  ~~

翻译:如果您的枚举使用了相关值,则无法对其进行等效测试。

注意:如果.aMoreComplexCase(和相应的测试)被删除,那么代码将按预期工作。

在过去,人们似乎决定使用运算符重载来解决这个问题:How to test equality of Swift enums with associated values。但是现在我们有Swift 4,我想知道是否有更好的方法?或者,如果有更改使链接的解决方案无效?

谢谢!

1 个答案:

答案 0 :(得分:5)

Swift提案

已在 Swift 4.1 (Xcode 9.3)中接受并实施:

  

...如果所有成员都是Equatable / Hashable,则合成Equatable / Hashable的一致性。

因此足以

  

...选择自动合成,将其类型声明为Equatable或Hashable,而不执行任何要求。

在您的示例中 - 由于StringEquatable - 只需声明

enum AnEnumeration: Equatable {
  case aSimpleCase
  case anotherSimpleCase
  case aMoreComplexCase(String)
}

,编译器将合成一个合适的==运算符。