Подтвердить что ты не робот

Тестирование значения enum не выполняется, если у него есть связанное значение?

Я тестирую это на игровой площадке, и я не уверен, как это сделать. С нормальным перечислением, которое не имеет связанных значений, все в порядке.

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

var direction = CompassPoint.East

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

Однако, если одно из моих перечислений имеет связанное значение, тест направления не выполняется с этой ошибкой: не удалось найти элемент "Запад"

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

var direction = CompassPoint.East

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

Что я могу сделать, чтобы разрешить этот тест?

4b9b3361

Ответ 1

Перечисления автоматически 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