swift - 我如何在 Swift 4 中测试具有关联值的枚举案例的等效性

标签 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,我想知道是否有更好的方法?或者是否有更改使链接的解决方案无效?

谢谢!

最佳答案

Swift 提案

已在 Swift 4.1 (Xcode 9.3) 中被接受和实现:

... synthesize conformance to Equatable/Hashable if all of its members are Equatable/Hashable.

因此就足够了

... opt-in to automatic synthesis by declaring their type as Equatable or Hashable without implementing any of their requirements.

在您的示例中 - 由于 StringEquatable - 它足以声明

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

编译器将合成一个合适的==操作符。

关于swift - 我如何在 Swift 4 中测试具有关联值的枚举案例的等效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46782139/

相关文章:

c - 这些 C 运算符是什么意思?

ios - Swift 更喜欢LargeTitles 在 WKWebview 加载时折叠

swift - 无法在 Swift 中访问 textDocumentProxy 协议(protocol)函数

c# - ExpressMapper - 映射/克隆枚举 - InvalidCastException

C# 枚举解析和反射

java - 我收到从 int 到 boolean 类型不匹配的错误

ios - 模态关闭后,键盘显示错误的颜色 - iOS

ios - 增加可滚动内容的高度(从顶部开始)

c# - 使用静态可见性枚举作为命令参数

javascript - while (i --> 0) 是什么意思?