如何通过忽略它的关联值在Swift中比较枚举和关联的值?

阅读后如何testing与相关值的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.") } 

但是,这不会编译:

 let number = CardRank.Number(5) if number == CardRank.Number { print("You must play a face card!") } 

…并提供以下错误信息:

二进制运算符'=='不能应用于'CardRank'和'(Int) – > CardRank'types的操作数

我假设这是因为它期待一个完整的types和CardRank.Number不指定一个完整的types,而CardRank.Number(2) 。 但是,在这种情况下,我希望它匹配任何数字; 不只是一个具体的。

很明显,我可以使用switch语句,但是实现==操作符的全部意思是避免这个冗长的解决scheme:

 switch number { case .Number: print("You must play a face card!") default: break } 

有没有办法比较枚举与关联的值,而忽略其相关的值?

注意:我意识到我可以将==方法中的case (.Number, .Number): return true更改为case (.Number, .Number): return true ,但是,虽然它将正确case (.Number, .Number): return true ,但我的比较仍然看起来像是将其与具体数字( number == CardRank.Number(2) ;其中2是一个虚拟值)而不是任何数字( number == CardRank.Number )。

编辑:正如Etan所指出的,你可以省略(_)通配符匹配来更清楚的使用它。


不幸的是,我不认为在Swift 1.2中有一个比你的switch方法更简单的方法。

但是,在Swift 2中,可以使用新的if-case模式匹配:

 let number = CardRank.Number(5) if case .Number(_) = number { // Is a number } else { // Something else } 

如果你想避免冗长,你可以考虑添加一个isNumber计算属性到你的枚举实现你的switch语句。

不幸的是,在Swift 1.x中没有另外的方法,所以你必须使用不像Swift 2的版本那样优雅的switchif case你可以使用if case

 if case .Number = number { //ignore the value } if case .Number(let x) = number { //without ignoring } 

这是一个更简单的方法:

 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) } } 

没有必要重载==操作符,并且检查卡types不需要混淆语法:

 let card = CardRank.Jack if card == CardRank.Jack { print("You played a jack") } else if !card.isFaceCard { print("You must play a face card!") }