请注意,我已阅读此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
语句不起作用。
答案 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
不是最好的答案,因为还有很多代码要进行检查,但实际使用它时,至少检查只有一行。