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

时间:2014-09-08 14:23:27

标签: enums 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!")
}

我可以做些什么才能进行此测试?

1 个答案:

答案 0 :(得分:22)

如果枚举的原始值为Equatable,则枚举会自动Equatable。在您的第一种情况下,原始值假定为Int,但如果您为其提供了另一种特定类型,例如UInt32甚至String,则会起作用。

但是,添加关联值后,与Equatable的自动一致性不再发生,因为您可以声明:

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

这些是平等的吗?斯威夫特怎么知道的?您必须通过将enum声明为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