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

时间:2016-12-16 21:40:43

标签: 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具有关联值,因此我不能简单地使用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语句不起作用。

5 个答案:

答案 0 :(得分:11)

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

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

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

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

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

答案 1 :(得分:4)

您可以使用guard

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

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

答案 2 :(得分:1)

您可以编写计算属性并根据情况返回bool值

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语句,或者只是你不想将它与其他代码混合使用。我认为在根据具体情况编写您需要执行的任何实现之前,这是一种很好且干净的检查方法。

答案 3 :(得分:1)

怎么样:

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

答案 4 :(得分:1)

在枚举上创建一个var,用于计算您的值是否为.b(_)

enum MyEnum {

    case a
    case b(Int)
    case c
    case d

    var notB: Bool {
        switch self {
        case .b(_):
            return false
        default:
            return true
        }
    }
}

MyEnum.a.notB // true
MyEnum.b(1).notB  // false
MyEnum.c // true
MyEnum.d // true

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