原文: https://www.programiz.com/swift-programming/switch-statement

在本文中,您将学习使用switch控制语句来控制程序执行的流程。

switch语句也是各种 Swift 控制语句,例如if-elseguard等,根据不同的条件执行不同的动作。

switch语句的优点在于,它可以将值与几种可能的匹配模式进行比较。 因此,它可以在匹配复杂模式时用作长if..else..if梯形图的替代品。


switch语句的语法

switch语句的语法为:

  1. switch variable/expression {
  2. case value1:
  3. // statements
  4. case value2:
  5. // statements
  6. default:
  7. // statements
  8. }

Swift 中的Switch语句如何工作?

  • switch表达式只计算一次。
  • 它采用表达式并按顺序(上->下)与每个个案值进行比较。
  • 如果存在匹配项,则将执行case内的语句,并在第一个匹配的switch case完成后立即完成整个switch语句的执行。
  • 如果没有匹配的情况,则落到下一个情况。
  • 如果没有匹配的情况,则default关键字指定要运行的代码。

`switch`语句 - 图1

注意:每种情况的正文都必须至少包含一个可执行语句。


示例 1:使用Switch语句的简单程序

  1. let dayOfWeek = 4
  2. switch dayOfWeek {
  3. case 1:
  4. print("Sunday")
  5. case 2:
  6. print("Monday")
  7. case 3:
  8. print("Tuesday")
  9. case 4:
  10. print("Wednesday")
  11. case 5:
  12. print("Thursday")
  13. case 6:
  14. print("Friday")
  15. case 7:
  16. print("Saturday")
  17. default:
  18. print("Invalid day")
  19. }

当您运行上述程序时,输出将是:

  1. Wednesday

在上述程序中,switch语句通过将dayOfWeek值与case 1匹配来开始。 由于dayOfWeek值与第一个案例值 1 不匹配,因此它会降到下一个案例,直到一个匹配。

由于case 4switch表达式匹配,因此执行该案例中的语句print("Wednesday")并终止switch case。 如果没有大小写匹配,则执行default内部的语句。


示例 2:带有穿透的Switch语句

如果在case语句中使用fallthrough关键字,则即使case值与switch表达式不匹配,控制也会继续进行下一个case

  1. let dayOfWeek = 4
  2. switch dayOfWeek {
  3. case 1 :
  4. print("Sunday")
  5. case 2:
  6. print("Monday")
  7. case 3:
  8. print("Tuesday")
  9. case 4:
  10. print("Wednesday")
  11. fallthrough
  12. case 5:
  13. print("Thursday")
  14. case 6:
  15. print("Friday")
  16. case 7:
  17. print("Saturday")
  18. default:
  19. print("Invalid day")
  20. }

运行该程序时,输出为:

  1. Wednesday
  2. Thursday

在上述程序中,case 4执行语句print("Wednesday")fallthrough关键字进入case 5。 即使大小写与switch表达式不匹配,case 5中的语句print("Thursday")也会执行。 因此,您可以在控制台中看到星期四的输出。


示例 3:具有更复杂模式的Switch语句

  1. let programmingLanguage = (name: "Go", version: 10)
  2. switch programmingLanguage {
  3. case (let name,let version) where (version < 0 && name.count < 0) :
  4. print("Invalid input")
  5. case ("Swift",let version) where version == 4:
  6. print("Found latest version of Swift")
  7. case ("Swift" , ..<4 ):
  8. print("Found older version of swift)")
  9. case ("Swift" ,4...) :
  10. print("Swift version greater than 4 is not released yet")
  11. case ("Taylor Swift",30) :
  12. print("OMG. This is Taylor swift")
  13. case (let name, let version):
  14. print("""
  15. Programming Language:\(name)
  16. Version: \(version)
  17. Status: Not found
  18. """)
  19. }

运行该程序时,输出为:

  1. Programming Language:Go
  2. Version: 10
  3. 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)
    这种情况将元组的每个值绑定到临时常量或变量。