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

如何用关联值测试Swift枚举的相等性

双俊人
2023-03-14
问题内容

我想测试两个Swift枚举值的相等性。例如:

enum SimpleToken {
    case Name(String)
    case Number(Int)
}
let t1 = SimpleToken.Number(123)
let t2 = SimpleToken.Number(123)
XCTAssert(t1 == t2)

但是,编译器不会编译相等表达式:

error: could not find an overload for '==' that accepts the supplied arguments
    XCTAssert(t1 == t2)
    ^~~~~~~~~~~~~~~~~~~

我是否定义了自己的等于运算符的重载?我希望Swift编译器能够自动处理它,就像Scala和Ocaml一样。


问题答案:

正如@jedwid有用地指出的那样,从Swift
4.1开始(由于SE-0185,Swift还支持合成Equatable以及Hashable具有关联值的枚举。

因此,如果您使用的是Swift 4.1或更高版本,则以下内容将自动合成可行的必要html" target="_blank">方法XCTAssert(t1 == t2)。关键是将Equatable协议添加到您的枚举中。

enum SimpleToken: Equatable {
    case Name(String)
    case Number(Int)
}
let t1 = SimpleToken.Number(123)
let t2 = SimpleToken.Number(123)

在Swift 4.1之前

正如其他人指出的那样,Swift不会自动综合必要的相等运算符。不过,让我提出一个更清洁的(IMHO)实现:

enum SimpleToken: Equatable {
    case Name(String)
    case Number(Int)
}

public func ==(lhs: SimpleToken, rhs: SimpleToken) -> Bool {
    switch (lhs, rhs) {
    case let (.Name(a),   .Name(b)),
         let (.Number(a), .Number(b)):
      return a == b
    default:
      return false
    }
}

这远非理想-重复很多-但至少您不需要在内部带有if语句的嵌套开关。



 类似资料:
  • 问题内容: 我想测试枚举类型的几个变量的等效性,如下所示: 可悲的是,这些都会产生这样的错误: 翻译:如果您的枚举使用关联的值,则无法测试它的等效性。 注意:如果(和相应的测试)已删除,则代码将按预期工作。 4,我想知道是否有更好的方法?还是发生了使链接的解决方案无效的更改? 谢谢! 问题答案: 迅捷的建议 SE-0185合成平等和可哈希的一致性 已在 Swift 4.1 (Xcode 9.3)中

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

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

  • 本文向大家介绍深入探究Swift枚举关联值的内存,包括了深入探究Swift枚举关联值的内存的使用技巧和注意事项,需要的朋友参考一下 这是枚举最基础的用法,但是在swift中,对枚举的功能进行了加强,也就是关联值。 关联值可以将额外信息附加到 enum case中,像下面这样子。 我们可以看到,在我们创建一个枚举值t的时候,设置他的选项为test1,同时可以关联3个Int类型的值,然后在switch

  • 问题内容: tl; dr 是否可以实例化具有类型关联值的通用Swift 4枚举成员? 背景 我正在使用一个简单的 Result 枚举(类似于典型的Result): 现在,我想使用这个枚举来表示操作的结果,该操作不会产生实际的结果值;该操作是 成功 还是 失败 。为此,我将类型定义为,但是我在如何创建Result实例方面苦苦挣扎,这都不可行。 问题答案: 在Swift 3中,您可以省略type的关联

  • 我的模式如下 我正在尝试编写一个方法来检查代码并返回相应的枚举。 event.getStatusCode的有效值是:A,T,U。现在我需要检查这些代码并根据代码返回枚举。我尝试了上面的方法,但它给我代码=["A"]的错误。下面是错误状态。 我该怎么解决这个问题?我是java新手。非常感谢您的帮助,谢谢