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.Jackif 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!")}
…它给出以下错误信息:
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是虚拟值),而不是任何数字(number == CardRank.Number)。
编辑:正如Etan所指出的那样,您可以省略(_)通配符匹配以更干净地使用。不幸的是,我不相信在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中忽略其关联值来比较枚举与关联值?全部内容,希望文章能够帮你解决如何通过在Swift中忽略其关联值来比较枚举与关联值?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)