原文: https://www.programiz.com/swift-programming/switch-statement
在本文中,您将学习使用switch
控制语句来控制程序执行的流程。
switch
语句也是各种 Swift 控制语句,例如if-else
,guard
等,根据不同的条件执行不同的动作。
switch
语句的优点在于,它可以将值与几种可能的匹配模式进行比较。 因此,它可以在匹配复杂模式时用作长if..else..if
梯形图的替代品。
switch
语句的语法
switch
语句的语法为:
switch variable/expression {
case value1:
// statements
case value2:
// statements
default:
// statements
}
Swift 中的Switch
语句如何工作?
switch
表达式只计算一次。- 它采用表达式并按顺序(上->下)与每个个案值进行比较。
- 如果存在匹配项,则将执行
case
内的语句,并在第一个匹配的switch case
完成后立即完成整个switch
语句的执行。 - 如果没有匹配的情况,则落到下一个情况。
- 如果没有匹配的情况,则
default
关键字指定要运行的代码。
注意:每种情况的正文都必须至少包含一个可执行语句。
示例 1:使用Switch
语句的简单程序
let dayOfWeek = 4
switch dayOfWeek {
case 1:
print("Sunday")
case 2:
print("Monday")
case 3:
print("Tuesday")
case 4:
print("Wednesday")
case 5:
print("Thursday")
case 6:
print("Friday")
case 7:
print("Saturday")
default:
print("Invalid day")
}
当您运行上述程序时,输出将是:
Wednesday
在上述程序中,switch
语句通过将dayOfWeek
值与case 1
匹配来开始。 由于dayOfWeek
值与第一个案例值 1 不匹配,因此它会降到下一个案例,直到一个匹配。
由于case 4
与switch
表达式匹配,因此执行该案例中的语句print("Wednesday")
并终止switch case
。 如果没有大小写匹配,则执行default
内部的语句。
示例 2:带有穿透的Switch
语句
如果在case
语句中使用fallthrough
关键字,则即使case
值与switch
表达式不匹配,控制也会继续进行下一个case
。
let dayOfWeek = 4
switch dayOfWeek {
case 1 :
print("Sunday")
case 2:
print("Monday")
case 3:
print("Tuesday")
case 4:
print("Wednesday")
fallthrough
case 5:
print("Thursday")
case 6:
print("Friday")
case 7:
print("Saturday")
default:
print("Invalid day")
}
运行该程序时,输出为:
Wednesday
Thursday
在上述程序中,case 4
执行语句print("Wednesday")
,fallthrough
关键字进入case 5
。 即使大小写与switch
表达式不匹配,case 5
中的语句print("Thursday")
也会执行。 因此,您可以在控制台中看到星期四的输出。
示例 3:具有更复杂模式的Switch
语句
let programmingLanguage = (name: "Go", version: 10)
switch programmingLanguage {
case (let name,let version) where (version < 0 && name.count < 0) :
print("Invalid input")
case ("Swift",let version) where version == 4:
print("Found latest version of Swift")
case ("Swift" , ..<4 ):
print("Found older version of swift)")
case ("Swift" ,4...) :
print("Swift version greater than 4 is not released yet")
case ("Taylor Swift",30) :
print("OMG. This is Taylor swift")
case (let name, let version):
print("""
Programming Language:\(name)
Version: \(version)
Status: Not found
""")
}
运行该程序时,输出为:
Programming Language:Go
Version: 10
Status: Not found
在上面的程序中,我们以不同的情况匹配元组类型的表达式programmingLanguage
,如下所示:
case (let name,let version) where (version < 0 && name.count < 0)
这种情况下,将switch
表达式值绑定到临时常量或变量,以使用let
关键字在案例的正文中使用。 这称为值绑定。
您也可以使用where
子句将条件应用于这些值。 对于多个条件,您可以使用&&
运算符将它们连接起来,如上例所示。
如果条件不满足where
子句中定义的条件,则这些case
块内的语句将不执行,并且无法通过比较下一个switch
的条件。case ("Swift" , ..<4 )
这种情况将元组第一个元素与字符串字面值"Swift"
匹配,并且还检查第二个元素是否在单边范围..<4
内。case ("Swift" ,4...)
这种情况将元组第一个元素与字符串字面值"Swift"
匹配,并且还检查第二个元素是否在单边范围4…
内。case (let name, let version)
这种情况将元组的每个值绑定到临时常量或变量。