我是swift的新手,有人可以告诉我是否可以改进此切换声明?还是一种新方法?
switch (a, b) {
case (c, bb),
(cc, bb),
(ccc, bb):
// do something like print (1)
case (z, bb),
(zz, bb),
(zzz, bb):
// do something like print (2)
case (x, bc):
// do something like print (3)
}
是否可以执行以下操作?或类似的东西?
case ((c OR cc OR ccc), bb):
// do something?
case ((z OR zz OR zzz), bb):
// do something?
如何缩短此开关盒?
答案 0 :(得分:4)
以下是一些选项。
如果c,cc,ccc和z,zz,zzz是连续的值范围,有几种方法可以使用范围运算符:
switch (a, b) {
case (c...ccc, bb):
print("matched \(a), bb")
case (let x, bb) where z...zzz ~= x:
print("matched \(x), bb")
}
如果使用范围测试不起作用,一些基本的where
表达式将起作用,但我认为当有两个以上的值要测试时,这看起来不太好:
switch (a, b) {
case (let x, bb) where x == c || x == cc || x == ccc:
print("matched \(x), bb")
case (_, bb) where a == z || a == zz || a == zzz:
print("matched \(a), bb")
}
这是一个使用数组和contains
函数的示例,当您有大量要测试的值时,它看起来好一点:
switch (a, b) {
case (let x, bb) where [c, cc, ccc].contains(x):
print("matched \(x), bb")
case (_, bb) where [z, zz, zzz].contains(a):
print("matched \(a), bb")
}
我想不出一个更为原生的Swift语法,它类似于你的((c OR cc OR ccc), bb)
想法,以简洁的方式测试多个案例。
稍微退一步,在您的特定情况下,将一些逻辑(例如c / cc / ccc测试)移动到单独的函数或变量中可能是有价值的。例如:
switch (a, b) {
case (_, bb) where a.isOneOfTheCValues:
case (_, bb) where a.isOneOfTheZValues:
case (x, bc):
}