模式(Patterns)
1.0 翻译:honghaoz 校对:numbbbbb, stanzhai
2.0 翻译+校对:ray16897188,
2.1 翻译:BridgeQ
模式代表单个值或者复合值的结构。例如,元组 (1, 2)
的结构是由逗号分隔的,包含两个元素的列表。因为模式代表一种值的结构,而不是特定的某个值,你可以利用模式来匹配各种各样的值。比如,(x, y)
可以匹配元组 (1, 2)
,以及任何含两个元素的元组。除了利用模式匹配一个值以外,你可以从复合值中提取出部分或全部值,然后分别把各个部分的值和一个常量或变量绑定起来。
Swift 中的模式分为两类:一种能成功匹配任何类型的值,另一种在运行时匹配某个特定值时可能会失败。
第一类模式用于解构简单变量、常量和可选绑定中的值。此类模式包括通配符模式、标识符模式,以及包含前两种模式的值绑定模式和元组模式。你可以为这类模式指定一个类型标注,从而限制它们只能匹配某种特定类型的值。
第二类模式用于全模式匹配,这种情况下你试图匹配的值在运行时可能不存在。此类模式包括枚举用例模式、可选模式、表达式模式和类型转换模式。你在 switch
语句的 case
标签中,do
语句的 catch
子句中,或者在 if
、while
、guard
和 for-in
语句的 case
条件句中使用这类模式。
模式语法
枚举用例模式
模式 → 可选模式
模式 → 类型转换模式
模式 → 表达式模式
模式 | let 模式
元组模式元素列表可选)
元组模式元素 | 元组模式元素 , 元组模式元素列表
元组模式元素 → 模式
元组模式可选
is模式 | as模式
is模式 → is 类型
as模式 → 类型
表达式模式(Expression Pattern)
表达式模式代表表达式的值。表达式模式只出现在 switch
语句中的 case
标签中。
表达式模式代表的表达式会使用 Swift 标准库中的 ~=
运算符与输入表达式的值进行比较。如果 ~=
运算符返回 true
,则匹配成功。默认情况下,~=
运算符使用 ==
运算符来比较两个相同类型的值。它也可以将一个整型数值与一个 Range
实例中的一段整数区间做匹配,正如下面这个例子所示:
let point = (1, 2)
switch point {
case (0, 0):
print("(0, 0) is at the origin.")
case (-2...2, -2...2):
print("(\(point.0), \(point.1)) is near the origin.")
default:
print("The point is at (\(point.0), \(point.1)).")
}
// 打印 “(1, 2) is near the origin.”
你可以重载 ~=
运算符来提供自定义的表达式匹配行为。比如你可以重写上面的例子,将 point
表达式与字符串形式表示的点进行比较。
// 重载 ~= 运算符对字符串和整数进行比较
func ~=(pattern: String, value: Int) -> Bool {
return pattern == "\(value)"
}
switch point {
case ("0", "0"):
print("(0, 0) is at the origin.")
default:
print("The point is at (\(point.0), \(point.1)).")
}
// 打印 “The point is at (1, 2).”