How to test equality of Swift enums with associated values를 읽은 후 다음 enum을 구현했습니다.
enum CardRank {
case Number(Int)
case Jack
case Queen
case King
case Ace
}
func ==(a: CardRank, b: CardRank) -> Bool {
switch (a, b) {
case (.Number(let a), .Number(let b)) where a == b: return true
case (.Jack, .Jack): return true
case (.Queen, .Queen): return true
case (.King, .King): return true
case (.Ace, .Ace): return true
default: return false
}
}
다음 코드가 작동합니다.
let card: CardRank = CardRank.Jack
if card == CardRank.Jack {
print("You played a jack!")
} else if card == CardRank.Number(2) {
print("A two cannot be played at this time.")
}
그러나 이것은 컴파일되지 않습니다.
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
… 다음과 같은 오류 메시지가 표시됩니다.
이항 연산자 ‘==’는 ‘CardRank’및 ‘(Int)-> CardRank’유형의 피연산자에 적용 할 수 없습니다.
나는 이것이 전체 유형을 기대하고 전체 유형을 CardRank.Number
지정하지 않았기 때문에 이것이라고 가정하고 CardRank.Number(2)
있습니다. 그러나이 경우 어떤 숫자 와 도 일치하기를 원합니다 . 특정한 것이 아닙니다.
분명히 switch 문을 사용할 수 있지만 ==
연산자 구현의 요점은 이 장황한 솔루션을 피하는 것이 었습니다.
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
연관된 값을 무시하면서 열거 형을 연관된 값과 비교할 수있는 방법이 있습니까?
참고 : 나는 내가 경우를 바꿀 수 실현 ==
에 대한 방법 case (.Number, .Number): return true
(제대로 사실 반환하지만,하지만, 내 비교는 여전히 특정 번호에 비해 그 존재처럼 보이는 것 number == CardRank.Number(2)
, (2)는 더미 값이다)보다는 어떤 수를 ( number == CardRank.Number
).
답변
편집 : Etan이 지적했듯이 (_)
와일드 카드 일치를 생략하여 보다 깔끔하게 사용할 수 있습니다 .
안타깝게도 switch
Swift 1.2에서 접근 하는 것보다 쉬운 방법은 없다고 생각합니다 .
그러나 Swift 2에서는 새로운 if-case
패턴 일치를 사용할 수 있습니다 .
let number = CardRank.Number(5)
if case .Number(_) = number {
// Is a number
} else {
// Something else
}
자세한 정보를 피하려면 isNumber
switch 문을 구현하는 열거 형에 계산 된 속성을 추가하는 것을 고려할 수 있습니다 .
답변
불행히도 Swift 1.x에는 다른 방법이 없으므로 사용해야합니다. switch
있는 Swift 2 버전만큼 우아하지 않은 합니다 if case
.
if case .Number = number {
//ignore the value
}
if case .Number(let x) = number {
//without ignoring
}
답변
Swift 4.2에서는 Equatable
모든 관련 값이 Equatable
. 을 추가하기 만하면 Equatable
됩니다.
enum CardRank: Equatable {
case Number(Int)
case Jack
case Queen
case King
case Ace
}
https://developer.apple.com/documentation/swift/equatable?changes=_3
답변
다음은 더 간단한 접근 방식입니다.
enum CardRank {
case Two
case Three
case Four
case Five
case Six
case Seven
case Eight
case Nine
case Ten
case Jack
case Queen
case King
case Ace
var isFaceCard: Bool {
return (self == Jack) || (self == Queen) || (self == King)
}
}
== 연산자를 오버로드 할 필요가 없으며 카드 유형을 확인하는 데 복잡한 구문이 필요하지 않습니다.
let card = CardRank.Jack
if card == CardRank.Jack {
print("You played a jack")
} else if !card.isFaceCard {
print("You must play a face card!")
}
답변
당신은 필요가 없습니다 func ==
나 Equatable
. 그냥 사용 열거 경우 패턴을 .
let rank = CardRank.Ace
if case .Ace = rank { print("Snoopy") }