我如何测试枚举案例与 Swift 4 中关联值的等效性
How may I test the equivalency of enumeration cases with associated values in Swift 4
我想测试几个枚举类型变量的等价性,像这样:
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。但是现在有了Swift4,不知道有没有更好的办法呢?或者是否有更改使链接的解决方案无效?
谢谢!
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.
在您的示例中 – 因为 String
是 Equatable
– 声明
就足够了
enum AnEnumeration: Equatable {
case aSimpleCase
case anotherSimpleCase
case aMoreComplexCase(String)
}
编译器会合成一个合适的==
运算符。
我想测试几个枚举类型变量的等价性,像这样:
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。但是现在有了Swift4,不知道有没有更好的办法呢?或者是否有更改使链接的解决方案无效?
谢谢!
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.
在您的示例中 – 因为 String
是 Equatable
– 声明
enum AnEnumeration: Equatable {
case aSimpleCase
case anotherSimpleCase
case aMoreComplexCase(String)
}
编译器会合成一个合适的==
运算符。