如何通过忽略它的关联值在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的版本那样优雅的switch
, if 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!") }