Swift 如何检查枚举是否与模式不匹配?
请注意,我已经读过这篇文章,但是post使用了一个switch语句,当模式匹配时,它应该执行一些操作(返回true)。一、 另一方面,如果模式匹配,则不希望执行任何操作,并使用if case语句 我有这个枚举: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
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
}
或者,省略caseb的关联值的冗余模式匹配:
if case .b = myEnum {} else {
// do your thing here
}
这看起来有点像一个guard
子句,但没有退出范围。对不起,但我意识到我没有提供足够的上下文。我的代码不能在那之后返回。无论模式是否匹配,都需要执行一些代码。尽管如此,你还是值得投一票@Sweeper是的,在我发布答案后考虑到了这一点,所以我添加了一个注释:)为什么不使用返回枚举(开关)状态的函数或计算属性。注意,不需要在模式匹配中包含()
。不需要在模式匹配中包含()
。
if case .b = myEnum {} else {
// do your thing here
}