*模式* 代表单个值或者复合值的结构。例如,元组 `(1, 2)` 的结构是用逗号分隔的两个元素的列表。因为模式代表值的结构而不是任何特定的值,你可以用各种同类型的值来和它匹配。例如,模式 `(x, y)` 匹配元组 `(1, 2)` 和其他任何包含两个元素的元组。除了值与模式匹配,你可以提取部分或者全部复合值,并将每个部分分别绑定到常量或变量。
在Swift中,这里有两种基本类型的模式:一类为成功匹配任何类型值的模式,另一类为可能无法在运行时匹配指定值的模式。
第一种模式被用来解构简单变量,常量和可选绑定中的值。这类包含包括通配符的模式,标识符模式以及包含任何值绑定或者元组的模式。你可以给这类模式的指定类型标注从而限制它们只能匹配某种特定类型的值。
第二种模式用于完全模式匹配,此时你想要匹配的值在运行时可能还不存在。这些包含枚举用例模式 (enumeration case patterns),可选模式 ( optional patterns),表达式模式 (expression patterns),以及类型转换模式 (type-casting patterns)。这些模式可以应用于 `switch` 语句的case中, `do` 语句的一个 `catch` 子句中,或者在 `if`, `while`, `guard`, 或者 `for`-`in` 语句的case条件语句中。
> 模式语法
>
> 模式 → [通配符模式](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#//appleref/swift/grammar/wildcard-pattern)[类型标注](https://docs.swift.org/swift-book/ReferenceManual/Types.html#//appleref/swift/grammar/type-annotation) 可选
>
> 模式 → [标识符模式](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#//appleref/swift/grammar/identifier-pattern)[类型标注](https://docs.swift.org/swift-book/ReferenceManual/Types.html#//appleref/swift/grammar/type-annotation) 可选
>
> 模式 → [值绑定模式](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#//appleref/swift/grammar/value-binding-pattern)
>
> 模式 → [元组模式](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#//appleref/swift/grammar/tuple-pattern) [类型标注](https://docs.swift.org/swift-book/ReferenceManual/Types.html#//appleref/swift/grammar/type-annotation) 可选
>
> 模式 → [枚举模式](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#//appleref/swift/grammar/enum-case-pattern)
>
> 模式 → [可选模式](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#//appleref/swift/grammar/optional-pattern)
>
> 模式 → [类型转换模式](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#//appleref/swift/grammar/type-casting-pattern)
>
> 模式 → [表达式模式](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#//appleref/swift/grammar/expression-pattern)
通配符模式
-------------------------------------
*通配符* 模式匹配并忽略任何值,由下划线(`_`)组成。如果不关心匹配的值,请使用通配符模式。例如,以下代码遍历闭合区间 `1...3`,忽略每次循环迭代的当前值:
```
for _ in 1...3 {
// 做3次操作
}
```
> 通配符模式语法
>
> 通配符模式 → `_`
标识符模式
---------------------------------------
*标识符模式* 匹配任何值,并将匹配的值绑定到变量或常量。例如,在下面的常量声明中,`someValue` 是一个与 `Int` 类型的值 `42` 匹配的标识符模式:
```
let someValue = 42
```
匹配成功后,值 `42` 被绑定(赋值)给常量名称 `someValue` 。
当变量或常量声明的左侧的模式是标识符模式时,标识符模式隐式地是值绑定模式的子模式。
> 标识符模式语法
>
> 标识符模式 → [identifier](https://docs.swift.org/swift-book/ReferenceManual/LexicalStructure.html#//appleref/swift/grammar/identifier)
值绑定模式
------------------------------------------
*值绑定* 模式将匹配的值与变量或常量名绑定。值绑定模式中将匹配值绑定到常量名是以 `let` 关键字开头;绑定到变量名是以 `var` 关键字开头。
值绑定模式中的标识符模式将新命名的变量或常量与匹配的值绑定。例如,你可以将元组的元素分解,并将每个元素的值绑定到标识符模式。
```
let point = (3, 2)
switch point {
// 将 point 的值绑定到 x, y
case let (x, y):
print("The point is at (\(x), \(y)).")
}
// 打印 "The point is at (3, 2)."
```
在上面的例子中,`let` 分配到元组模式 `(x,y)` 中的每一个标识符模式。基于此行为,`switch` 条件中 `case let (x, y):` 和 `case (let x, lety):` 匹配相同的值。
> 值匹配模式语法
>
> 值匹配模式 → `var` [模式](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#//appleref/swift/grammar/pattern) | `let` [模式](https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#//appleref/swift/grammar/pattern)