如何检查枚举是否与模式不匹配?

Swe*_*per 7 enums pattern-matching swift

请注意,我已阅读此帖,但该帖子使用了switch语句,当模式匹配时,它应该执行某些操作(返回true).另一方面,如果模式匹配并使用if-case语句,我不想​​做任何事情.

我有这个枚举:

enum MyEnum {
    case a
    case b(Int)
    case c
    case d
}
Run Code Online (Sandbox Code Playgroud)

这是它的一个实例:

let myEnum: MyEnum = .a
Run Code Online (Sandbox Code Playgroud)

现在我想要做一些事情,如果myEnum不是.b.由于.b有一个关联的值,我不能简单地使用if语句检查:

if myEnum != .b { // compiler error
    // do my thing here
}
Run Code Online (Sandbox Code Playgroud)

所以我必须使用if-case语句来模式匹配它:

if case .b(_) = myEnum {

} else {
    // do my thing here
}
Run Code Online (Sandbox Code Playgroud)

但我真的很讨厌使用空if子句.这对我来说只是看起来不够.我试图天真地这样做:

if case .b(_) != myEnum { // compiler error!
    // do my thing here
}
Run Code Online (Sandbox Code Playgroud)

除了使用空的if子句之外,还有更好的方法吗?

无论模式是否匹配,我仍然有应该运行的代码,因此guard语句将不起作用.

dfr*_*fri 11

这纯粹是对您自己的代码的最小语义更改,但请注意,您可以简单地"丢弃" ifcase模式匹配内联的空子句:

if case .b(_) = myEnum {} else {
    // do your thing here
}
Run Code Online (Sandbox Code Playgroud)

或者,省略与案例相关值的冗余模式匹配b:

if case .b = myEnum {} else {
    // do your thing here
}
Run Code Online (Sandbox Code Playgroud)

这看起来有点像一个guard子句,但没有退出范围.


Cri*_*tik 5

您可以使用guard

guard case .b = myEnum else { 
    // do your stuff here
    return 
}
Run Code Online (Sandbox Code Playgroud)

缺点是您必须退出范围...