阅读
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!") }
…它给出以下错误信息:
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 }
原文地址:https://www.jb51.cc/swift/320732.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。