加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何通过在Swift中忽略其关联值来比较枚举与关联值?

发布时间:2020-12-14 05:58:25 所属栏目:百科 来源:网络整理
导读:阅读 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),.N
阅读 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
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读