【问题标题】:How do I shorten this switch case?如何缩短此开关盒?
【发布时间】:2018-05-07 14:54:55
【问题描述】:

我是 swift 新手,谁能告诉我是否可以改进这个 switch 语句?还是一种新方法?

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? 

如何缩短此开关盒?

【问题讨论】:

标签: swift switch-statement


【解决方案1】:

这里有几个选项。

如果 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):
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多