4

当我执行这段代码时,只是print("it is greater than zero")被执行了,但我有两种情况是正确的,我尝试使用fallthrough关键字,但即使它是错误的,它也会执行下一个 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")
}

预先感谢您的回答!

4

2 回答 2

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 _广泛使用,你可能没有switch在 Swift 中正确使用,应该使用if.

于 2018-11-13T22:46:06.923 回答
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
}
于 2018-11-13T23:06:01.540 回答