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

如果枚举值具有关联的值,则测试会失败?

司马飞
2023-03-14
问题内容

我正在操场上进行测试,不确定如何执行此操作。对于没有关联值的普通枚举,一切都很好。

enum CompassPoint {
    case North
    case South
    case East
    case West
}

var direction = CompassPoint.East

if direction != .West {
    println("Go West!")
}

但是,如果我的一个枚举具有关联的值,则方向测试将因以下错误而失败:找不到成员“ West”

enum CompassPoint {
    case North(Int)
    case South
    case East
    case West
}

var direction = CompassPoint.East

if direction != .West {
    println("Go West!")
}

我该怎么做才能进行这项测试?


问题答案:

枚举Equatable的原始值为时,将自动进行枚举Equatable。在您的第一种情况下,假定原始值为Int,但是如果您给它指定另一个特定类型(例如UInt32或),它将有效String

但是,一旦添加了关联值,Equatable就不会再发生这种自动符合性,因为您可以声明以下内容:

let littleNorth = CompassPoint.North(2)
let bigNorth = CompassPoint.North(99999)

那些相等吗?Swift应该怎么知道?您必须通过声明enumas Equatable并实现==运算符来告诉它:

enum CompassPoint : Equatable {
    case North(Int)
    case South
    case East
    case West
}

public func ==(lhs:CompassPoint, rhs:CompassPoint) -> Bool {
    switch (lhs, rhs) {
    case (.North(let lhsNum), .North(let rhsNum)):
        return lhsNum == rhsNum
    case (.South, .South): return true
    case (.East, .East): return true
    case (.West, .West): return true
    default: return false
    }
}

现在,您可以测试是否相等或不平等,如下所示:

let otherNorth = CompassPoint.North(2)
println(littleNorth == bigNorth)            // false
println(littleNorth == otherNorth)          // true


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

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

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

  • 问题内容: 什么是C#的Java等价物: 问题答案: 如果需要属性,则需要这样定义: 您可以这样使用它: 要意识到的是,这只是创建类的捷径,因此您可以向该类添加所需的任何属性和方法。 如果您不想在自己的方法上定义任何方法,则可以更改成员变量的范围并进行设置,但这不是它们在Sun网站上的示例中所做的。

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

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