我如何可以测试的枚举情况下,等同与关联值在斯威夫特4

问题描述:

我想考枚举类型的一对夫妇变量的等价,这样的:我如何可以测试的枚举情况下,等同与关联值在斯威夫特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。但现在我们有了Swift 4,我想知道是否有更好的方法?或者如果有变化导致链接解决方案失效?

谢谢!

+3

这些答案仍然有效。当https://github.com/apple/swift-evolution/blob/master/proposals/0185-synthesize-equatable-hashable.md被实现时,它将变得更简单。 –

+0

这就是我所需要的。我已经让我的代码正常工作。也许你应该让这个评论成为答案,所以我可以将其标记为已解决? – MadEmperorYuri

雨燕建议

已被接受,在雨燕4.1(Xcode的9.3, 目前处于测试阶段)来实现:

...合成如果它的所有成员都是Equatable/Hashable,则符合Equatable/Hashable。因此

它足以

...通过声明它们的类型作为Equatable或可哈希而不实施任何他们的要求选择在对自动合成。

在您的例子 - 因为StringEquatable - 这将足以宣布

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

,编译器会合成一个合适的==运营商。