# `switch`语句

> 原文： [https://www.programiz.com/swift-programming/switch-statement](https://www.programiz.com/swift-programming/switch-statement)

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

`switch`语句也是各种 Swift 控制语句，例如[`if-else`](/swift-programming/if-else-statement "Swift if-else statement")，[`guard`](/swift-programming/guard-statement)等，根据不同的条件执行不同的动作。

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

* * *

## `switch`语句的语法

`switch`语句的语法为：

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

* * *

## Swift 中的`Switch`语句如何工作？

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

![Swift switch statement flowchart](img/b4f315a91a9d4ad79b99e84d605e32ac.png "Swift switch statement flowchart")

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

* * *

### 示例 1：使用`Switch`语句的简单程序

```swift
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")
} 
```

当您运行上述程序时，输出将是：

```swift
Wednesday
```

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

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

* * *

### 示例 2：带有穿透的`Switch`语句

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

```swift
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")
} 
```

运行该程序时，输出为：

```swift
Wednesday
Thursday
```

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

* * *

### 示例 3：具有更复杂模式的`Switch`语句

```swift
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
		""")
} 
```

运行该程序时，输出为：

```swift
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)`

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