一尘不染

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

swift

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

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!")
}

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


阅读 268

收藏
2020-07-07

共1个答案

一尘不染

枚举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
2020-07-07