patterns_23:29_06/29/2015_Preliminary

This commit is contained in:
ray16897188
2015-06-29 23:29:12 +08:00
parent 989e827aff
commit 47fee2b7d5

View File

@ -11,25 +11,25 @@
- [值绑定模式Value-Binding Pattern](#value-binding_pattern) - [值绑定模式Value-Binding Pattern](#value-binding_pattern)
- [元组模式Tuple Pattern](#tuple_pattern) - [元组模式Tuple Pattern](#tuple_pattern)
- [枚举用例模式Enumeration Case Pattern](#enumeration_case_pattern) - [枚举用例模式Enumeration Case Pattern](#enumeration_case_pattern)
- [可选模式Optional Patterns](#optional_pattern) - [可选模式Optional Pattern](#optional_pattern)
- [类型转换模式Type-Casting Patterns](#type-casting_pattern) - [类型转换模式Type-Casting Pattern](#type-casting_pattern)
- [表达式模式Expression Pattern](#expression_pattern) - [表达式模式Expression Pattern](#expression_pattern)
模式pattern代表了单个值或者复合值的结构。例如元组`(1, 2)`的结构是逗号分隔的,包含两个元素的列表。因为模式代表一种值的结构,而不是特定的某个值,你可以把模式和各种同类型的值匹配起来。比如,`(x, y)`可以匹配元组`(1, 2)`,以及任何含两个元素的元组。除了将模式与一个值匹配外,你可以从复合值中提取出部分或全部,然后分别把各个部分和一个常量或变量绑定起来。 模式pattern代表了单个值或者复合值的结构。例如元组`(1, 2)`的结构是逗号分隔的,包含两个元素的列表。因为模式代表一种值的结构,而不是特定的某个值,你可以把模式和各种同类型的值匹配起来。比如,`(x, y)`可以匹配元组`(1, 2)`,以及任何含两个元素的元组。除了将模式与一个值匹配外,你可以从复合值中提取出部分或全部,然后分别把各个部分和一个常量或变量绑定起来。
swift语言中模式有2个基本的分类一类能成功和任何值的类型相匹配另一类在运行时runtime和某特定值匹配时可能会失败。 swift语言中模式有2个基本的分类一类能成功和任何值的类型相匹配另一类在运行时runtime和某特定值匹配时可能会失败。
第一类模式用于解构简单变量常量和可选绑定中的值。此类模式包括通配符模式wildcard patterns标识符模式identifier patterns以及任何包含了它们的值绑定模式value binding patterns或者元祖模式tuple patterns。你可以为这类模式指定一个类型注type annotation从而限制它们只能匹配某种特定类型的值。 第一类模式用于解构简单变量常量和可选绑定中的值。此类模式包括通配符模式wildcard patterns标识符模式identifier patterns以及任何包含了它们的值绑定模式value binding patterns或者元祖模式tuple patterns。你可以为这类模式指定一个类型type annotation从而限制它们只能匹配某种特定类型的值。
第二类模式用于全模式匹配,这种情况下你用来相比较的值在运行时可能还不存在。此类模式包括枚举用例模式,可选模式,表达式模式和类型转换模式。你在`switch`语句的case标签中`do`语句的`catch`从句中,或者在`if, while, guard``for-in`语句的case条件句中使用这类模式。 第二类模式用于全模式匹配,这种情况下你用来相比较的值在运行时可能还不存在。此类模式包括枚举用例模式enumeration case patterns可选模式optional patterns表达式模式expression patterns和类型转换模式type-casting patterns。你在`switch`语句的case标签中`do`语句的`catch`从句中,或者在`if, while, guard``for-in`语句的case条件句中使用这类模式。
> 模式(Patterns) 语法 > 模式(Patterns) 语法
> *模式* → [*通配符模式*](..\chapter3\07_Patterns.html#wildcard_pattern) [*类型注*](..\chapter3\03_Types.html#type_annotation) _可选_ > *模式* → [*通配符模式*](..\chapter3\07_Patterns.html#wildcard_pattern) [*类型注*](..\chapter3\03_Types.html#type_annotation) _可选_
> *模式* → [*标识符模式*](..\chapter3\07_Patterns.html#identifier_pattern) [*类型注*](..\chapter3\03_Types.html#type_annotati(Value Binding)on) _可选_ > *模式* → [*标识符模式*](..\chapter3\07_Patterns.html#identifier_pattern) [*类型注*](..\chapter3\03_Types.html#type_annotati(Value Binding)on) _可选_
> *模式* → [*值绑定模式*](..\chapter3\07_Patterns.html#value_binding_pattern) > *模式* → [*值绑定模式*](..\chapter3\07_Patterns.html#value_binding_pattern)
> *模式* → [*元组模式*](..\chapter3\07_Patterns.html#tuple_pattern) [*类型注*](..\chapter3\03_Types.html#type_annotation) _可选_ > *模式* → [*元组模式*](..\chapter3\07_Patterns.html#tuple_pattern) [*类型注*](..\chapter3\03_Types.html#type_annotation) _可选_
> *模式* → [*枚举用例模式*](..\chapter3\07_Patterns.html#enum_case_pattern) > *模式* → [*枚举用例模式*](..\chapter3\07_Patterns.html#enum_case_pattern)
> *模式* → [*可选模式*](..\chapter3\07_Patterns.html#optional_pattern) [*类型注解*](..\chapter3\03_Types.html#optional_type) _可选_ > *模式* → [*可选模式*](..\chapter3\07_Patterns.html#optional_pattern)
> *模式* → [*类型转换模式*](..\chapter3\07_Patterns.html#type_casting_pattern) > *模式* → [*类型转换模式*](..\chapter3\07_Patterns.html#type_casting_pattern)
> *模式* → [*表达式模式*](..\chapter3\07_Patterns.html#expression_pattern) > *模式* → [*表达式模式*](..\chapter3\07_Patterns.html#expression_pattern)
@ -40,7 +40,7 @@ swift语言中模式有2个基本的分类一类能成功和任何值的类
```swift ```swift
for _ in 1...3 { for _ in 1...3 {
// Do something three times. // Do something three times.
} }
``` ```
@ -90,7 +90,7 @@ case let (x, y):
元组模式是逗号分隔的列表,包含一个或多个模式,并包含在一对圆括号中。元组模式匹配相应元组类型的值。 元组模式是逗号分隔的列表,包含一个或多个模式,并包含在一对圆括号中。元组模式匹配相应元组类型的值。
你可以使用类型注来限制一个元组模式来匹配某种元组类型。例如,在常量申明`let (x, y): (Int, Int) = (1, 2)`中的元组模式`(x, y): (Int, Int)`,只匹配两个元素都是`Int`这种类型的元组。如果仅需要限制一个元组模式中的某几个元素,只需要直接对这几个元素提供类型注即可。例如,在`let (x: String, y)`中的元组模式,只要某个元组类型是包含两个元素,且第一个元素类型是`String`,则被匹配。 你可以使用类型注来限制一个元组模式来匹配某种元组类型。例如,在常量申明`let (x, y): (Int, Int) = (1, 2)`中的元组模式`(x, y): (Int, Int)`,只匹配两个元素都是`Int`这种类型的元组。如果仅需要限制一个元组模式中的某几个元素,只需要直接对这几个元素提供类型注即可。例如,在`let (x: String, y)`中的元组模式,只要某个元组类型是包含两个元素,且第一个元素类型是`String`,则被匹配。
当元组模式被用在`for-in`语句或者变量或常量申明时,它可以包含通配符模式,标识符模式,可选模式或者其他包含这些模式的元祖模式。例如,下面这段代码是不正确的,因为`(x, 0)`中的元素`0`是一个表达式模式: 当元组模式被用在`for-in`语句或者变量或常量申明时,它可以包含通配符模式,标识符模式,可选模式或者其他包含这些模式的元祖模式。例如,下面这段代码是不正确的,因为`(x, 0)`中的元素`0`是一个表达式模式:
@ -199,7 +199,7 @@ default:
// prints "(1, 2) is near the origin.” // prints "(1, 2) is near the origin.”
``` ```
你可以重载`~=`操作符来提供自定义的表达式行为。例如,你可以重写上面的例子,以实现用字符串表达的点来比较`point`表达式。 你可以重载`~=`操作符来提供自定义的表达式匹配行为。比如你可以重写上面的例子,`point`表达式去比较字符串形式的点
```swift ```swift
// Overload the ~= operator to match a string with an integer // Overload the ~= operator to match a string with an integer
@ -209,8 +209,6 @@ func ~=(pattern: String, value: Int) -> Bool {
switch point { switch point {
case ("0", "0"): case ("0", "0"):
print("(0, 0) is at the origin.") print("(0, 0) is at the origin.")
case ("-2...2", "-2...2"):
print("(\(point.0), \(point.1)) is near the origin.")
default: default:
print("The point is at (\(point.0), \(point.1)).") print("The point is at (\(point.0), \(point.1)).")
} }