【发布时间】:2015-10-11 11:39:28
【问题描述】:
阅读How to test equality of Swift enums with associated values后,我实现了以下枚举:
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) 指定了一个完整的类型。但是,在这种情况下,我希望它匹配 any 数字;不只是一个特定的。
显然我可以使用 switch 语句,但实现 == 运算符的全部目的是避免这种冗长的解决方案:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
有没有什么方法可以将枚举与关联值进行比较而忽略其关联值?
注意:我意识到我可以将 == 方法中的大小写更改为 case (.Number, .Number): return true,但是,虽然它会正确返回 true,但我的比较看起来仍然像被比较一个特定的数字(number == CardRank.Number(2);其中 2 是一个虚拟值)而不是任何数字(number == CardRank.Number)。
【问题讨论】:
-
您可以将
==运算符实现中的Jack、Queen、King、Ace案例减少为:case (let x, let y) where x == y: return true
标签: swift enums comparison