Ответ 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