> IOS开发在线手册 > 模式(Patterns)

模式(Patterns)


1.0 翻译:honghaoz 校对:numbbbbb, stanzhai

2.0 翻译+校对:ray16897188,

2.1 翻译:BridgeQ

模式代表单个值或者复合值的结构。例如,元组 (1, 2) 的结构是由逗号分隔的,包含两个元素的列表。因为模式代表一种值的结构,而不是特定的某个值,你可以利用模式来匹配各种各样的值。比如,(x, y) 可以匹配元组 (1, 2),以及任何含两个元素的元组。除了利用模式匹配一个值以外,你可以从复合值中提取出部分或全部值,然后分别把各个部分的值和一个常量或变量绑定起来。

Swift 中的模式分为两类:一种能成功匹配任何类型的值,另一种在运行时匹配某个特定值时可能会失败。

第一类模式用于解构简单变量、常量和可选绑定中的值。此类模式包括通配符模式、标识符模式,以及包含前两种模式的值绑定模式和元组模式。你可以为这类模式指定一个类型标注,从而限制它们只能匹配某种特定类型的值。

第二类模式用于全模式匹配,这种情况下你试图匹配的值在运行时可能不存在。此类模式包括枚举用例模式、可选模式、表达式模式和类型转换模式。你在 switch 语句的 case 标签中,do 语句的 catch 子句中,或者在 ifwhileguardfor-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).” 

表达式模式语法
表达式模式表达式