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

Swift 如何检查枚举是否与模式不匹配?,swift,enums,pattern-matching,Swift,Enums,Pattern Matching,请注意,我已经读过这篇文章,但是post使用了一个switch语句,当模式匹配时,它应该执行一些操作(返回true)。一、 另一方面,如果模式匹配,则不希望执行任何操作,并使用if case语句 我有这个枚举: enum MyEnum { case a case b(Int) case c case d } 下面是一个例子: let myEnum: MyEnum = .a 现在我想做一些事情,如果myEnum不是.b。由于.b有一个关联的值,我不能简单地使用i

请注意,我已经读过这篇文章,但是post使用了一个switch语句,当模式匹配时,它应该执行一些操作(返回true)。一、 另一方面,如果模式匹配,则不希望执行任何操作,并使用if case语句

我有这个枚举:

enum MyEnum {
    case a
    case b(Int)
    case c
    case d
}
下面是一个例子:

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

if myEnum != .b { // compiler error
    // do my thing here
}
所以我必须使用if case语句来匹配它:

if case .b(_) = myEnum {

} else {
    // do my thing here
}
但是我真的很讨厌使用空if子句。那对我来说就是不结实。我试图天真地这样做:

if case .b(_) != myEnum { // compiler error!
    // do my thing here
}
除了使用空if子句,还有更好的方法吗


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

您可以使用
guard

guard case .b = myEnum else { 
    // do your stuff here
    return 
}

缺点是您必须退出作用域…

您可以编写一个计算属性,并让它根据具体情况返回布尔值

enum MyEnum {
  case a
  case b(Int)
  case c

 var isCaseB: Bool {
     switch self {
       case .b(_):
         return true
       default:
         return false
       }
    }
 }
然后在您的代码中清楚地检查:

if !enumVal.isCaseB {

}
我检查了您在问题中提到的答案,但我不确定您的意思是根本不想使用switch语句,还是只是不想将其与其他代码混合。我认为这是一种很好且干净的方法,可以在编写任何需要根据具体情况执行的实现之前进行检查。

关于:

switch myEnum {
case .b(_):
    break
default:
    // do your thing here
}

在枚举上创建一个var,该var计算您的值是否不是
.b()


这不是最好的答案,因为还有很多代码要做检查,但当您实际使用它时,至少检查只有一行。

这只是您自己代码的最小语义更改,但请注意,您可以简单地“丢弃”与
大小写
模式匹配内联的空
if
子句:

if case .b(_) = myEnum {} else {
    // do your thing here
}
或者,省略case
b的关联值的冗余模式匹配:

if case .b = myEnum {} else {
    // do your thing here
}

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

对不起,但我意识到我没有提供足够的上下文。我的代码不能在那之后返回。无论模式是否匹配,都需要执行一些代码。尽管如此,你还是值得投一票@Sweeper是的,在我发布答案后考虑到了这一点,所以我添加了一个注释:)为什么不使用返回枚举(开关)状态的函数或计算属性。注意,不需要在模式匹配中包含
()
。不需要在模式匹配中包含
()
if case .b = myEnum {} else {
    // do your thing here
}