如何缩短此开关盒?

时间:2018-05-07 14:54:56

标签: swift switch-statement

我是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? 

如何缩短此开关盒?

1 个答案:

答案 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):
}