Swift `类似开关的模式匹配控制流语句,匹配任何和所有真实情况?
注意:此问题不是寻求帮助解决FizzBuzz。请不要发布只解决FizzBuzz问题的答案。此问题的答案应与匹配多个trueSwift `类似开关的模式匹配控制流语句,匹配任何和所有真实情况?,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的语句将非常有用,它匹配任何真实情况,而不仅仅是第一种情况 模式匹配模式当前可用于以下
switch
案例相关
考虑在Swift中尝试使用以下解决方案:
迭代15
的正确输出应该是“FizzBuzz”
,因为15可以被3和5整除
但是上面的程序输出“Fizz”,因为只执行第一个通过的案例
委员会:
switch语句根据成功匹配的第一个模式执行适当的代码块
似乎有一个类似于switch的语句将非常有用,它匹配任何真实情况,而不仅仅是第一种情况
模式匹配模式当前可用于以下情况:
您可以在switch语句的case标签、do语句的catch子句、if、while、guard或for in语句的case条件中使用这些模式
在Swift中,匹配多个模式似乎是不可能的。考虑的备选方案:
失败
Switchfallthrough
允许一个已执行的案例落入下一个案例并执行物理上的下一个案例,但不实际测试案例语句。它不允许仅在匹配时执行多个任意无序案例
多个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”的正确输出:如果它们与你的问题完全相同,我就关闭它。考虑到你的问题中没有提到他们,我想你可能想看看他们。