阅读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)指定了.然而,在本例中,我希望它匹配any号;不仅仅是一个具体的问题.

显然,我可以使用switch语句,但实现==运算符的全部目的是避免这种冗长的解决方案:

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

是否有任何方法可以将枚举与关联值进行比较,同时忽略其关联值?

Note:我意识到我可以将==方法中的case改为case (.Number, .Number): return true,但是,尽管它会正确返回true,但我的比较看起来仍然像是与特定数字(number == CardRank.Number(2);其中2是一个伪值)进行比较,而不是与any数字(number == CardRank.Number)进行比较.

推荐答案

Edit:正如Etan指出的,可以省略(_)通配符匹配,以便更清晰地使用它.


不幸的是,我不认为有比Swift 1.2中的switch方法更简单的方法.

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

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

如果你想避免冗赘,你可以考虑在EnUM中添加一个isNumber计算的属性来实现你的转换语句.

Swift相关问答推荐

防止NavigationLink自行返回导航视图

在解码字符串时需要帮助.

在Swift中,是否只有iOS版本超过15才能导入Swift包?

如何将图像插入到矩形中

ClosedRange.Swift 中 Int 的索引?

Swift UI中视图上的值未更新

如何删除快速处理消息

Swift 并发任务与调度队列线程:是什么决定同时运行多少任务?

在 struct 中的序列和非序列泛型函数之间进行 Select

供应和普通数组中具有空值的 map 函数的行为不一致?

单元测试和私有变量

swift:修改字典中的数组

在 Swift 中强制崩溃的最简单方法

是否可以在 Swift 中创建通用闭包?

将if let与逻辑或运算符一起使用

如何在 iOS Swift 中进行多线程、并发或并行?

如何快速截取 UIView 的屏幕截图?

无法推断泛型参数的参数

Swift - 迭代 struct 对象时如何对其进行变异

在 Swift 中覆盖 UIScrollView 的委托属性(就像 UICollectionView 一样)