Swift `类似开关的模式匹配控制流语句,匹配任何和所有真实情况?

Swift `类似开关的模式匹配控制流语句,匹配任何和所有真实情况?,swift,switch-statement,pattern-matching,programming-languages,control-flow,Swift,Switch Statement,Pattern Matching,Programming Languages,Control Flow,注意:此问题不是寻求帮助解决FizzBuzz。请不要发布只解决FizzBuzz问题的答案。此问题的答案应与匹配多个trueswitch案例相关 考虑在Swift中尝试使用以下解决方案: 迭代15的正确输出应该是“FizzBuzz”,因为15可以被3和5整除 但是上面的程序输出“Fizz”,因为只执行第一个通过的案例 委员会: switch语句根据成功匹配的第一个模式执行适当的代码块 似乎有一个类似于switch的语句将非常有用,它匹配任何真实情况,而不仅仅是第一种情况 模式匹配模式当前可用于以下

注意:此问题不是寻求帮助解决FizzBuzz。请不要发布只解决FizzBuzz问题的答案。此问题的答案应与匹配多个true
switch
案例相关

考虑在Swift中尝试使用以下解决方案:

迭代
15
的正确输出应该是
“FizzBuzz”
,因为15可以被3和5整除

但是上面的程序输出“Fizz”,因为只执行第一个通过的
案例

委员会:

switch语句根据成功匹配的第一个模式执行适当的代码块

似乎有一个类似于switch的
语句将非常有用,它匹配任何真实情况,而不仅仅是第一种情况

模式匹配模式当前可用于以下情况:

您可以在switch语句的case标签、do语句的catch子句、if、while、guard或for in语句的case条件中使用这些模式

在Swift中,匹配多个模式似乎是不可能的。考虑的备选方案:

失败 Switch
fallthrough
允许一个已执行的案例落入下一个案例并执行物理上的下一个案例,但不实际测试案例语句。它不允许仅在匹配时执行多个任意无序案例

多个
if
语句 多个
if
语句会产生所需的行为,但出于同样的原因,它们会让人恼火
switch
通常比
if-else
块更受欢迎

if (i % 3 == 0) {
    // ...
}
if (i % 5 == 0) {
    // ...
}
也就是说,在每种情况下重新声明要测试的变量,没有编译器保护,我们在多个情况下评估同一个变量,等等

元组等。 是的,可以执行诸如打开元组之类的操作来生成正确的输出值。但这涉及到在箱子里复制代码

switch (i % 3, i % 5) {
case (0, 0):
    output += "FizzBuzz"
case (0, _):
    output += "Fizz"
case (_, 0):
    output += "Buzz"
这个问题的目标是只有两个“嘶嘶”和“嗡嗡”的案例。真正案例的组合执行应该产生“FizzBuzz”,而不是复制字符串的单独第三个案例

相关的:

问题:
是否存在类似于
开关的模式匹配控制流语句,它匹配任何和所有真实情况?如果不是在Swift中,是否有任何语言包含这样的功能?

此循环嵌套的
开关
语法按顺序执行每个真实情况,而不仅仅是第一个真实情况

for i in 1...100 {
    var output = ""

    for eachCase in 0...1 {
        switch (eachCase, 0) {
        case (0, i % 3): output += "Fizz"
        case (1, i % 5): output += "Buzz"
        default: break }
    }

    if output.isEmpty {
        output = String(i)
    }

    print(output)
}

我将把它留给读者来决定在哪些情况下,这种行为比其他选择更好,例如多个
if
语句。

这个嵌套
开关的循环
语法按顺序执行每个真实情况,而不仅仅是第一个真实情况

for i in 1...100 {
    var output = ""

    for eachCase in 0...1 {
        switch (eachCase, 0) {
        case (0, i % 3): output += "Fizz"
        case (1, i % 5): output += "Buzz"
        default: break }
    }

    if output.isEmpty {
        output = String(i)
    }

    print(output)
}

我将把它留给读者来确定在哪些情况下,这种行为比其他选择更好,例如多个
if
语句。

有一个快速发展的建议,在切换案例中引入一个
continue
语句,它将恢复与其余案例的模式匹配

[swift evolution][Pitch]介绍继续切换语句 此方案通过引入
continue
来完成switch语句的控制流传输套件。此更改增加了许多开发人员期望(但没有得到)的
故障诊断功能

引入
continue
意味着“执行此case子句后恢复模式匹配”。它提供了比当前交换机中更细微的控制


有一个快速发展的建议,在交换机案例中引入一个
continue
语句,它将恢复与其余案例的模式匹配

[swift evolution][Pitch]介绍继续切换语句 此方案通过引入
continue
来完成switch语句的控制流传输套件。此更改增加了许多开发人员期望(但没有得到)的
故障诊断功能

引入
continue
意味着“执行此case子句后恢复模式匹配”。它提供了比当前交换机中更细微的控制


这实际上是一个概念性的问题,还是你想解决这个问题?使用switch语句可以很容易地解决这个问题。@DávidPásztor怎么会这样?我感兴趣的是在switch语句中执行所有匹配的情况。是的,通过其他方法很容易获得“FizzBuzz”的正确输出:如果它们与你的问题完全相同,我就关闭它。考虑到你的问题中没有提到他们,我想你可能想看看他们。这实际上是一个概念性的问题,还是你想解决这个问题?使用switch语句可以很容易地解决这个问题。@DávidPásztor怎么会这样?我感兴趣的是在switch语句中执行所有匹配的情况。是的,通过其他方法很容易获得“FizzBuzz”的正确输出:如果它们与你的问题完全相同,我就关闭它。考虑到你的问题中没有提到他们,我想你可能想看看他们。