📜  Swift switch声明

📅  最后修改于: 2020-10-09 16:05:57             🧑  作者: Mango

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

 

switch语句也是各种Swift控制语句egif-else,guard等,它们根据不同的条件执行不同的操作。

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


switch语句的语法

switch语句的语法为:

switch variable/expression {
case value1:
    // statements
case value2:
    // statements
default:
    // statements
}

Swift中的Switch语句如何工作?
  • 开关表达式只计算一次。
  • 它接受表达式并按顺序(上->下)与每个个案值进行比较。
  • 如果存在匹配项,则在第一个匹配的切换用例完成后,将执行案例内的语句,并且整个switch语句将完成其执行。
  • 如果没有匹配的情况,则落到下一个情况。
  • 如果没有大小写匹配,则default关键字指定要运行的代码。

Swift switch statement flowchart

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


示例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不匹配,因此它将降到下一个案例,直到一个匹配。

 

由于案例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

在上述程序中, 壳体4个执行该语句print("Wednesday")fallthrough关键字进行到case5。即使案例与switch表达式不匹配, 案例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

在上面的程序中,我们匹配具有不同情况的元组类型的表达式编程语言 ,如下所示:

  • case (let name,let version) where (version < 0 && name.count < 0)

    这种情况将switch表达式的值绑定到临时常量或变量,以便在案例主体中使用let关键字。这称为值绑定。

    您还可以使用where子句将条件应用于这些值。对于多个条件,您可以使用&& 运算符将它们连接起来,如上例所示。

    如果case不满足where子句中定义的条件,则这些case块中的语句将不执行,并且无法通过比较下一个switch case。

  • case ("Swift" , ..<4 )

    这种情况下,将元组的第一个元素与字符串 字面量 "Swift"相匹配,并检查第二个元素是否位于单边范围内..<4

  • case ("Swift" ,4...)

    这种情况下,将元组的第一个元素与字符串 字面量 "Swift"相匹配,并检查第二个元素是否位于单边范围4…

  • case (let name, let version)

    这种情况将元组的每个值绑定到临时常量或变量。