如何通过忽略Swift中的关联值来比较枚举和关联值?

在阅读了如何用关联值测试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’的操作数

我假设这是因为它期望使用完整类型,CardRank.Number而不指定整个类型,而CardRank.Number(2)确实指定了。但是,在这种情况下,我希望它匹配

数字。不只是一个特定的

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

switch number {

case .Number:

print("You must play a face card!")

default:

break

}

有什么方法可以将枚举与关联值进行比较,而忽略其关联值?

我意识到我可以将==方法中的大小写更改为case (.Number, .Number): return

true,但是尽管它可以正确返回true,但我的比较仍然看起来像是将其与特定数字(number ==

CardRank.Number(2);其中2是虚拟值)而不是 任何 数字进行比较(number == CardRank.Number)。

回答:

正如Etan所指出的,您可以省略(_)通配符匹配以更简洁地使用它。


不幸的是,我不认为有比switchSwift 1.2中的方法更简单的方法。

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

let number = CardRank.Number(5)

if case .Number(_) = number {

// Is a number

} else {

// Something else

}

如果您要避免冗长,则可以考虑将isNumber枚举属性添加到实现switch语句的枚举中。

以上是 如何通过忽略Swift中的关联值来比较枚举和关联值? 的全部内容, 来源链接: utcz.com/qa/416120.html

回到顶部