当前位置: 首页 > 面试题库 >

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

艾凯捷
2023-03-14
问题内容

我想测试枚举类型的几个变量的等效性,如下所示:

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(和相应的测试)已删除,则代码将按预期工作。

4,我想知道是否有更好的方法?还是发生了使链接的解决方案无效的更改?

谢谢!


问题答案:

迅捷的建议

  • SE-0185合成平等和可哈希的一致性

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

…如果其所有成员都是平等/可哈希的,则综合符合平等/可哈希的标准。

因此,足以

…通过声明其类型为Equatable或Hashable来选择自动综合,而无需执行其任何要求。

在您的示例中-因为StringEquatable-声明就足够了

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

然后编译器将合成合适的==运算符。



 类似资料:
  • 问题内容: 我想测试两个Swift枚举值的相等性。例如: 但是,编译器不会编译相等表达式: 我是否定义了自己的等于运算符的重载?我希望Swift编译器能够自动处理它,就像Scala和Ocaml一样。 问题答案: 正如@jedwid有用地指出的那样,从Swift 4.1开始(由于SE-0185,Swift还支持合成以及具有关联值的枚举。 因此,如果您使用的是Swift 4.1或更高版本,则以下内容将

  • 问题内容: 我正在操场上进行测试,不确定如何执行此操作。对于没有关联值的普通枚举,一切都很好。 但是,如果我的一个枚举具有关联的值,则方向测试将因以下错误而失败:找不到成员“ West” 我该怎么做才能进行这项测试? 问题答案: 枚举的原始值为时,将自动进行枚举。在您的第一种情况下,假定原始值为,但是如果您给它指定另一个特定类型(例如或),它将有效。 但是,一旦添加了关联值,就不会再发生这种自动符

  • 问题内容: 在阅读了如何用关联值测试Swift枚举的相等性之后,我实现了以下枚举: 以下代码有效: 但是,这不能编译: …,并显示以下错误消息: 二进制运算符’==’不能应用于类型’CardRank’和’(Int)-> CardRank’的操作数 我假设这是因为它期望使用完整类型,而不指定整个类型,而确实指定了。但是,在这种情况下,我希望它匹配 任何 数字。不只是一个特定的 显然,我可以使用swi

  • 问题内容: 以前,我将LegNo枚举定义为: 通过调用,我可以获得与每个枚举关联的值。 但是现在我决定让枚举是int -1而不是0,所以我决定使用私有构造函数进行初始化并设置其int值 现在唯一的事情就是因为我这样做,所以该方法不适用于枚举。我如何获得与int相关联的枚举?除了使用case switch语句或if-elseif-elseif之外,还有其他有效的方法吗? 我可以看到很多与从枚举获取i

  • 以前,我将LegNo枚举简单定义为: 通过调用,我能够获得与每个枚举关联的值。 现在唯一的问题是,因为我是这样做的,方法将不能用于枚举。如何获得与int关联的枚举?除了使用case switch语句或if-elseif-elseif之外,是否还有其他有效的方法来完成此操作 我可以看到很多关于从枚举中获得int值的问题,但我想要的是相反的问题。

  • 问题内容: 我想知道在Java中是否可以嵌套枚举。 在这里,我想做的是: 拥有一个由CAT和DOG组成的物种,将允许我访问可用CAT和DOG品种的子枚举。例如,我希望能够测试是否装有CAT或DOG,以及动物是否是PERSAN CAT或PITBULL狗。CAT和DOG品种必须是不同的枚举,即CatBreeds枚举和DogBreeds枚举。 这是我要使用的访问模式的示例: 种类: 物种 种狗 品种: