Swift4.2语言参考(八) 模式

模式表示单个值或复合值的结构。例如,元组的结构是两个元素的逗号分隔列表。因为模式表示值的结构而不是任何一个特定值,所以可以将它们与各种值匹配。例如,模式匹配元组和任何其他两元素元组。除了将模式与值匹配之外,您还可以提取部分或全部复合值,并将每个部分绑定到常量或变量名称。(1, 2)(x, y)(1, 2)

在Swift中,有两种基本类型的模式:成功匹配任何类型值的模式,以及可能无法在运行时匹配指定值的模式。

第一种模式用于在简单变量,常量和可选绑定中对值进行解构。这些包括通配符模式,标识符模式以及包含它们的任何值绑定或元组模式。您可以为这些模式指定类型注释,以将它们约束为仅匹配特定类型的值。

第二种模式用于完整模式匹配,其中您尝试匹配的值可能在运行时不存在。这些包括枚举案例模式,可选模式,表达模式和类型转换模式。你在的情况下,标签使用这些模式switch声明,一个catch一个的条款do声明,或在的情况下条件ifwhileguard,或forin语句。

 1 GRAMMAR OF A PATTERN
 2
 3 pattern → wildcard-pattern type-annotation opt
 4
 5 pattern → identifier-pattern type-annotation opt
 6
 7 pattern → value-binding-pattern
 8
 9 pattern → tuple-pattern type-annotation opt
10
11 pattern → enum-case-pattern
12
13 pattern → optional-pattern
14
15 pattern → type-casting-pattern
16
17 pattern → expression-pattern

通配符模式

通配符模式相匹配,并且忽略任何值,并且由一个下划线的(_)。如果不关心要匹配的值,请使用通配符模式。例如,以下代码遍历闭合范围1...3,忽略循环每次迭代的范围的当前值:

1 for _ in 1...3 {
2     // Do something three times.
3 }
1 GRAMMAR OF A WILDCARD PATTERN
2
3 wildcard-pattern → _

标识符模式

一个标识符模式相匹配的任何值且匹配的值绑定到变量或常数名。例如,在以下常量声明中,someValue是一个与42type 的值匹配的标识符模式Int

1 let someValue = 42

匹配成功后,将值42绑定(分配)到常量名称someValue

当变量或常量声明的左侧的模式是标识符模式时,标识符模式隐式地是值绑定模式的子模式。

标识符模式的语法

标识符模式→ 标识符

值约束模式

值结合模式结合匹配的值到变量或常数名。将匹配值绑定到常量名称的值绑定模式以let关键字开头; 绑定到变量名称的那些以var关键字开头。

值绑定模式中的标识符模式将新的命名变量或常量绑定到其匹配值。例如,您可以分解元组的元素,并将每个元素的值绑定到相应的标识符模式。

1 let point = (3, 2)
2 switch point {
3     // Bind x and y to the elements of point.
4 case let (x, y):
5     print("The point is at (\(x), \(y)).")
6 }
7 // Prints "The point is at (3, 2)."

在上面的示例中,let分配给元组模式中的每个标识符模式。由于这种行为,案例和匹配相同的值。(x, y)switchcase let (x, y):case (let x, let y):

1 GRAMMAR OF A VALUE-BINDING PATTERN
2
3 value-binding-pattern → var pattern | let pattern

元组模式

元组模式是逗号分隔的零个或更多个模式列表中,用括号括起来。元组模式匹配相应元组类型的值。

您可以通过使用类型注释来约束元组模式以匹配某些类型的元组类型。例如,常量声明中的元组模式仅匹配其中两个元素都是类型的元组类型。(x, y): (Int, Int)let (x, y): (Int, Int) = (1, 2)Int

当元组模式用作forin语句或变量或常量声明中的模式时,它只能包含通配符模式,标识符模式,可选模式或包含这些模式的其他元组模式。例如,以下代码无效,因为0元组模式中的元素是表达式模式:(x, 0)

1 let points = [(0, 0), (1, 0), (1, 1), (2, 0), (2, 1)]
2 // This code isn‘t valid.
3 for (x, 0) in points {
4     /* ... */
5 }

包含单个元素的元组模式周围的括号无效。该模式匹配该单个元素类型的值。例如,以下内容是等效的:

1 let a = 2        // a: Int = 2
2 let (a) = 2      // a: Int = 2
3 let (a): Int = 2 // a: Int = 2
1 GRAMMAR OF A TUPLE PATTERN
2
3 tuple-pattern → ( tuple-pattern-element-list opt )
4
5 tuple-pattern-element-list → tuple-pattern-element | tuple-pattern-element , tuple-pattern-element-list
6
7 tuple-pattern-element → pattern | identifier : pattern

枚举案例模式

一个枚举的情况下模式相匹配的现有枚举类型的情况。枚举案例模式出现在switch声明的情况下标签和的情况下,条件ifwhileguard,和forin报表。

如果您尝试匹配的枚举大小写具有任何关联值,则相应的枚举大小写模式必须指定一个元组模式,该模式包含每个关联值的一个元素。有关使用switch语句匹配包含关联值的枚举个案的示例,请参阅关联值。

1 GRAMMAR OF AN ENUMERATION CASE PATTERN
2
3 enum-case-pattern → type-identifier opt . enum-case-name tuple-pattern opt

可选模式

一个可选的模式匹配包裹在一个值some(Wrapped)的情况下Optional<Wrapped>枚举。可选模式由标识符模式组成,紧接着是问号,并显示在与枚举案例模式相同的位置。

因为可选模式是Optional枚举案例模式的语法糖,所以以下是等效的:

 1 let someOptional: Int? = 42
 2 // Match using an enumeration case pattern.
 3 if case .some(let x) = someOptional {
 4     print(x)
 5 }
 6
 7 // Match using an optional pattern.
 8 if case let x? = someOptional {
 9     print(x)
10 }

可选模式提供了一种方便的方法来迭代forin语句中的可选值数组,仅针对非nil元素执行循环体。

1 let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
2 // Match only non-nil values.
3 for case let number? in arrayOfOptionalInts {
4     print("Found a \(number)")
5 }
6 // Found a 2
7 // Found a 3
8 // Found a 5
1 GRAMMAR OF AN OPTIONAL PATTERN
2
3 optional-pattern → identifier-pattern ?

类型铸造模式

有两种类型铸造模式,is模式和as模式。该is模式仅出现在switch语句案例标签中。在isas模式有如下形式:

1 is type
2 pattern as type

is模式的值相匹配,如果在运行时该值的类型是相同的的右手侧指定的类型is模式或该类型的一个子类。该is模式的行为类似于is运算符,因为它们都执行类型转换但丢弃返回的类型。

as模式的值相匹配,如果在运行时该值的类型是相同的的右手侧指定的类型as模式或该类型的一个子类。如果匹配成功,则匹配值的类型将转换为模式右侧指定的as模式。

对于使用中的示例switch语句来搭配价值观isas模式,看到所有和AnyObject类型转换。

1 GRAMMAR OF A TYPE CASTING PATTERN
2
3 type-casting-pattern → is-pattern | as-pattern
4
5 is-pattern → is type
6
7 as-pattern → pattern as type

表达模式

表达模式表示表达式的值。表达式模式仅出现在switch语句案例标签中。

使用Swift标准库~=运算符将表达式模式表示的表达式与输入表达式的值进行比较。如果~=操作员返回,则匹配成功true。默认情况下,~=运算符使用运算符比较两个相同类型的值==。它还可以通过检查值是否包含在范围内来匹配具有值范围的值,如以下示例所示。

 1 let point = (1, 2)
 2 switch point {
 3 case (0, 0):
 4     print("(0, 0) is at the origin.")
 5 case (-2...2, -2...2):
 6     print("(\(point.0), \(point.1)) is near the origin.")
 7 default:
 8     print("The point is at (\(point.0), \(point.1)).")
 9 }
10 // Prints "(1, 2) is near the origin."

您可以重载~=运算符以提供自定义表达式匹配行为。例如,您可以重写上面的示例,将point表达式与点的字符串表示进行比较。

 1 // Overload the ~= operator to match a string with an integer.
 2 func ~= (pattern: String, value: Int) -> Bool {
 3     return pattern == "\(value)"
 4 }
 5 switch point {
 6 case ("0", "0"):
 7     print("(0, 0) is at the origin.")
 8 default:
 9     print("The point is at (\(point.0), \(point.1)).")
10 }
11 // Prints "The point is at (1, 2)."
1 GRAMMAR OF AN EXPRESSION PATTERN
2
3 expression-pattern → expression

原文地址:https://www.cnblogs.com/strengthen/p/9740670.html

时间: 2024-10-15 09:49:29

Swift4.2语言参考(八) 模式的相关文章

Swift4.2语言参考(六) 声明

一个声明引入了一个新的名称或构建到你的程序.例如,您使用声明来引入函数和方法,引入变量和常量,以及定义枚举,结构,类和协议类型.您还可以使用声明来扩展现有命名类型的行为,并将符号导入到其他地方声明的程序中. 在Swift中,大多数声明也是定义,因为它们是在声明它们的同时实现或初始化的.也就是说,由于协议不实现其成员,因此大多数协议成员仅是声明.为方便起见,因为在Swift中区别并不重要,术语声明包括声明和定义. 1 GRAMMAR OF A DECLARATION 2 3 declaration

Swift4.2语言参考(九) 泛型和参数

本章介绍泛型类型,函数和初始值设定项的参数和参数.声明泛型类型,函数,下标或初始化程序时,可以指定泛型类型,函数或初始化程序可以使用的类型参数.当创建泛型类型的实例或调用泛型函数或初始化程序时,这些类型参数充当占位符,由实际的具体类型参数替换. 有关Swift中泛型的概述,请参阅泛型. 泛型子句 泛型子句指定的通用类型或功能的类型的参数,用这些参数任何相关联的约束和要求沿.泛型参数子句包含在尖括号(<>)中,并具有以下形式: <generic parameter list> 所述泛

Drools文档(八) 规则语言参考

规则语言参考 概述 Drools有一个"本地"的规则语言.这种格式在标点符号上非常轻,并且通过"扩展器"支持自然语言和领域特定的语言,使语言能够变形到您的问题领域.本章主要与本机规则格式一致.用于表示语法的图表被称为"铁路"图表,它们基本上是语言术语的流程图.技术上非常热衷的也可以参考DRL.g这是规则语言的Antlr3语法.如果您使用Rule Workbench,则可以通过内容帮助为您完成许多规则结构,例如,输入"ru"并按

嵌入式 Linux C语言(八)——存储类型、作用域、生命周期、链接属性

嵌入式 Linux C语言(八)--存储类型.作用域.生命周期.链接属性 一.存储类型 C语言中,每个变量和函数都有两个属性:数据类型和数据的存储类型. 变量的存储类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久.计算机中有三个地方可以用于存储变量:普通内存,运行时堆和栈,硬件寄存器.变量的存储类型取决于声明变量的位置. C语言存储类别说明符: 说明符 用    法 auto 只在代码块内变量声明中被允许, 表示变量具有本地生存期 extern 出现在顶

Swift语言指南(八)--语言基础之元组

元组 元组(Tuples)将多个值组合为一个复合值.元组内的值可以是任何类型,各个元素不需要为相同类型(各个元素之间类型独立,互不干扰--Joe.Huang). 下例中,(404, "Not Found") 是一个描述HTTP状态码的元组.HTTP状态码是当你向WEB服务器请求页面时服务器返回的一个特殊值,如果你(向WEB服务器)请求了一个不存在的网页,返回的状态码就是 404 Not Found : 1 let http404Error = (404, "Not Found

PHP-Manual的学习----【语言参考】

2017年6月28日11:29:31 语言参考    基本语法    类型    变量    常量1.当解析一个文件时,PHP 会寻找起始和结束标记,也就是 <?php 和 ?>,这告诉 PHP 开始和停止解析二者之间的代码.此种解析方式使得 PHP 可以被嵌入到各种不同的文档中去,而任何起始和结束标记之外的部分都会被 PHP 解析器忽略. 2.如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记.这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP

(转载)虚幻引擎3--UnrealScript语言参考

档概要: UnrealScript 介绍和简要参考.最初作者是Tim Sweeney (EpicGames) 内容 UnrealScript语言参考 介绍 快速链接 本文档的目的 UnrealScript的设计目标 虚幻引擎3中UnrealScript的新功能 代码结构示例 Unreal虚拟机 对象层次 类 变量 变量类型 内置类型 集合数据类型 Unreal类型 变量修饰符 可编辑性 数组 Structs 修饰符 枚举 常量 Object和actor引用变量 类引用变量 表达式 赋值 在类之间

寻找连通线,参考八后算法递归,可用于验证码去除连续干扰线

寻找连通线,参考八后算法递归,可用于验证码去除连续干扰线 https://github.com/isee15/captcha-ocr/blob/master/src/cn/z/NoiseLine.java package cn.z; import java.awt.Color;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException; import javax.imageio.ImageI

C语言各种存储模式的区别?最常用的存储模式有哪些?

DOS用一种段地址结构来编址计算机的内存,每一个物理内存位置都有一个可通过段地址一偏移量的方式来访问的相关地址.为了支持这种段地址结构,大多数C编译程序都允许你用以下6种存储模式来创建程序: -----------------------------------------------------------------------   存储模式              限制                    所用指针 -----------------------------------