如何使用where关键字快速检查switch语句中的所有情况?

时间:2018-11-13 22:29:12

标签: swift switch-statement fall-through

当我执行此代码时,仅执行print("it is greater than zero"),但是有两种情况是正确的,我尝试使用fallthrough关键字,但即使它为false,它也会执行下一个case块,无论如何,

这又引发了另一个问题,我什么时候应该使用fallthrough关键字?如果我要强制执行下一个块,为什么不将代码插入fallthrough所在的同一块中?

下面的示例是否可以打印出所有评估结果为true的案例,但仍排除所有评估结果为false的案例?

let number = 1

switch number {
case _ where number > 0:
    print("it is greater than zero")
case _ where number < 2:
    print("it is less than two")
case _ where number < 0:
    print("it is less than zero")
default:
    print("default")
}

预先感谢您的回答!

2 个答案:

答案 0 :(得分:2)

switch语句不是用于此目的,因此不能这样工作。目的是找到一个真实的案例。如果要检查多种情况,那只是一个if语句:

let number = 1

if number > 0 {
    print("it is greater than zero")
}
if number < 2 {
    print("it is less than two")
}
if number < 0 {
    print("it is less than zero")
}

没有等效的switch。它们是不同的控制语句。

您已经发现,fallthrough的存在允许两种情况运行同一块。这就是它的目的;它不会检查其他情况。通常,如果您广泛使用case _,则可能不是在Swift中正确使用switch,而应该使用if

答案 1 :(得分:1)

您是正确的,fallthrough的意思是“在不检查其真值的情况下进行下一个情况 ”。

因此,如果您只想在两种情况都为真的情况下执行第一种情况和第二种情况,则必须将第二种检查作为第一种情况的一部分进行。因此,与您的代码相比,最小的更改是:

let number = 1
switch number {
case _ where number > 0:
    print("it is greater than zero")
    if number < 2 { fallthrough } // <--
case _ where number < 2:
    print("it is less than two")
case _ where number < 0:
    print("it is less than zero")
default:
    print("default")
}

但是,这不是我写这个特定示例的方式。而且无论如何,您仍然面临当数字为-1时会发生什么的问题。小于2但小于0,因此您再次遇到相同的问题。从您的问题根本看不出这里的实际目标是什么!如果这确实是您要检测的三件事,那么最好使用两个单独的测试,因为它们之间并不是很明确的关联。例如:

let number = 1
switch number {
case ..<0:
    print("it is less than zero")
case 0...:
    print("it is zero or greater")
default: break
}
switch number {
case ..<2:
    print("it is less than two")
default: break
}