我想测试几个枚举类型变量的等价性,如下所示:
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,我想知道是否有更好的方法?或者,如果有更改使链接的解决方案无效?
谢谢!
解决方法
斯威夫特的提议
> SE-0185 Synthesizing Equatable and Hashable conformance
已被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) }
并且编译器将合成一个合适的==运算符.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。