最佳答案
在阅读 如何测试 Swift 枚举与相关值的相等性之后,我实现了以下枚举:
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.")
}
However, this doesn't compile:
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
它会给出以下错误信息:
Binary operator '==' cannot be applied to operands of type 'CardRank' and '(Int) -> CardRank'
我假设这是因为它期望一个完整的类型,而 CardRank.Number
没有指定一个完整的类型,而 CardRank.Number(2)
指定了。但是,在这种情况下,我希望它匹配 任何数字; 而不仅仅是一个特定的数字。
显然,我可以使用 switch 语句,但是实现 ==
操作符的全部目的是为了避免这种冗长的解决方案:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
有没有办法在忽略枚举的关联值的同时将枚举与关联值进行比较?
注意: 我意识到我可以将 ==
方法中的 case 改为 case (.Number, .Number): return true
,但是,尽管它会正确地返回 true,我的比较看起来仍然像是与一个特定的数字(number == CardRank.Number(2)
; 其中2是一个虚值)而不是 any数字(number == CardRank.Number
)进行比较。