swift模式和模式匹配
模式和模式匹配
模式:
代表单个或者复合值得结构,也就是说模式不是一个特定的值,它是一种抽象的结构,【一句话,不是特指,是泛指】。这样就可以用模式来匹配各种各样的值。
例如:(x,y)可以匹配元祖(1.2),以及任何包含两个元素的元组。
除了利用模式匹配一个值以外,你可以从复合值中提取出部分或全部值,然后把各个部分的值和一个常量或变量绑定起来。
swift中的模式分为两类:
一种能匹配任何类型的值,另一种在运行时匹配某个特定的值,可能会失败。
第一种模式用于结构简单变量,常量和可选绑定中的值。此类模式包括通配符模式,标识符模式,以及包含前两种模式的值绑定模式和元组模式。你可以为这类模式指定一个类型标注,从而限制它们只能匹配某种特定类型的值。
第二种模式用于全局模式匹配。这种情况下,你试图匹配的值在运行时可能不存在。此类模式包括枚举用例模式,可选模式,表达式模式和类型转换模式。你在switch语句的case标签中,do语句的catch 子句中,或者再if,while,guard,for-in语句的case条件语句中使用这类模式。
模式匹配
通配符模式 ( wildcard pattern)
通配符模式由一个下划线(_)构成,用于匹配并忽略任何值,当你想忽略被匹配的值时可以使用该模式。
for _ in 1...3{
}
标识符模式 (identifier pattern)
标识符模式可以匹配任何值,并将匹配的一个变量或者常量绑定起来
let someValue = 42
值绑定模式 value-binding pattern
值绑定模式把匹配到的值绑定给一个变量或者常量,把匹配到的值给常量是,用关键字 let, 绑定给变量时 用关键字 var
let point = (3, 2)
switch point {
//将point中的元素绑定到 x 和 y
case let (x, y):
print("point is at x:(\(x), \(y)")
}
元组模式 (tupel pattern)
元组模式是由都好分隔的,具有零个或多个模式的列表,并由一对圆括号括起来。元组模式匹配到响应的元组类型值。
你可以使用类型标注去限制一个元组模式只能匹配那种元组类型。例如, 在常量声明 let(x ,y):(Int, Int) = (1,2)中的元组模式(x,y):(Int,Int)就只能匹配两个元素都是Int类型的元组。
当元组模式被用于 for-in 语句或者变量和常量声明时,它仅可以包含通配符模式,标识符模式,可选模式或者其他包含这下模式的元组模式。
let points = [(0, 0), (1, 0), (1, 1), (2, 0), (2, 1)]
//便利 y==0 x是任意值的元组
for (x, y) in points where y==0 {
print("\(x) and \(y)")
}
枚举用例模式 enumeration case pattern
枚举用例模式匹配现有的某个枚举类型的某个用例。枚举用例模式出现在switch 语句中的 case 标签中,以及if,while,guard,for-in语句的case条件中。
可选项模式 optional pattern
可选项模式匹配 Optional 枚举在some(Wrapped)中包装的值。
可选项模式为 for-in 语句提供了一种迭代数组的简便方式,只为数组中非 nil 的元素执行循环体
let someOptional: Int? = 42
if case .some(let x) = someOptional {
print(x)//42
}
if case let x? = someOptional {
print(x)//42
}
let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
for case let number? in arrayOfOptionalInts {
print("fond a \(number)")//2,3,5
}
类型转换模式 Type-Casting Pattern
有两种类型转换模式, is模式和as模式, is 模式只出现在switch语句中的case标签中。
is 模式和 as 模式形式如下:
is 类型
模式 as 类型
*** is 模式仅当一个值的类型在运行时和is模式右边的指定类型一致,或者是其子类的情况下,才会匹配这个值。is模式和is 运算符有相似表现,它们都可进行类型转换,但是is模式没有返回类型 ***
*** as 模式仅当一个值得类型在运行时和as模式右边指定类型一致或者是其子类的情况下,才会匹配这个值,如果匹配成功,被匹配的值得类型被转换成as模式右边指定的类型 返回***
protocol Animal {
var name: String{get}
}
struct Dog: Animal {
var name: String {
return "Dog"
}
var runSpeed: Int
}
struct Bird: Animal {
var name: String {
return "Bird"
}
var flyHeight: Int
}
struct Fish: Animal {
var name: String {
return "fish"
}
var depth: Int
}
let animals: [Any] = [Dog(runSpeed: 10), Bird(flyHeight: 1000), Fish(depth: 300)]
for animal in animals {
switch animal {
case let dog as Dog:
print("\(dog.name) can run \(dog.runSpeed)")
case let fish as Fish:
print("\(fish.name) dive depth \(fish.depth)")
case is Bird:
print("bird can fly")
default:
print("unknown animal")
}
}
表达式模式 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.
自定义类型默认是无法进行表达式模式匹配的,也需要重载 ~= 运算符
struct Employee {
var salary: Int
}
//重载 ~= 才能对自定义的类进行 范围模式匹配
func ~= (left: ClosedRange<Int>, right: Employee) -> Bool {
return left.contains(right.salary)
}
var e: Employee = Employee(salary: 1000)
switch e {
case 0...1000:
print("穷")
case 1000...5000:
print("凑合")
case 5000...1000:
print("富")
default:
print("土豪")
}
swift模式和模式匹配的更多相关文章
- bash模式和模式匹配
bash模式和模式匹配 ${variable#pattern} 如果模式匹配变量取值的开头,删除最短匹配部分,返回其余部分 ${variable##pattern} 如果模式匹配变量取值的开头,删除最 ...
- swift 模式
原文:http://www.cocoachina.com/newbie/basic/2014/0612/8800.html 模式(pattern)代表了单个值或者复合值的结构.比如,元组(1, 2)的 ...
- oc kvc的模式:匹配搜索模式(模式匹配)、装包解包
按照一定规则使用匹配模式在目标空间进行搜索,然后执行相应操作: 运行时系统将kvc的运行机制解释为模式匹配,将值的兼容性问题解释为装包解包问题 一.模式匹配 The default implement ...
- swift错误和异常处理
异常 (exception) 和错误 (error). 在 Objective-C 开发中,异常往往是由程序员的错误导致的 app 无法继续运行,比如我们向一个无法响应某个消息的NSObject 对象 ...
- My Swift Study
参考资源 <swifter> https://github.com/iOS-Swift-Developers/Swift 闭包逃逸 swift3中,闭包默认是非逃逸的.如果一个函数参数可能 ...
- Programming In Scala笔记-第十五章、Case Classes和模式匹配
本章主要分析case classes和模式匹配(pattern matching). 一.简单例子 接下来首先以一个包含case classes和模式匹配的例子来展开本章内容. 下面的例子中将模拟实现 ...
- SQL反模式学习笔记17 全文搜索
目标:全文搜索 使用SQL搜索关键字,同时保证快速和精确,依旧是相当地困难. SQL的一个基本原理(以及SQL所继承的关系原理)就是一列中的单个数据是原子性的. 反模式:模式匹配 使用Like 或者正 ...
- scala 模式匹配详解 3 模式匹配的核心功能是解构
http://www.artima.com/scalazine/articles/pattern_matching.html这篇文章是odersky谈scala中的模式匹配的一段对话,我做了部分片段翻 ...
- Neo4j 第七篇:模式(Pattern)
模式和模式匹配是Cypher的核心,使用模式来描述所需数据的形状,该模式使用属性图的结构来描述,通常使用小括号()表示节点,-->表示关系,-[]->表示关系和关系的类型,箭头表示关系的方 ...
随机推荐
- 2.bash术语定义
2.术语定义POSIX:基于Unix的一系列操作系统可移植性的标准.Bash主要和POSIX标准第1003.1号中的<Shell和使用工具>有关.空白符:一个空格或者制表符.内部命令:在s ...
- 关于redis的几件小事(六)redis的持久化
1.redis持久化的意义 redis持久化的意义,在于 故障恢复 . 如果没有对数据进行持久化,那么如果redis遇到灾难性的故障,就会丢失所有的数据. 如果通过redis的持久化机制将数据持久化到 ...
- Centos7:zookeeper安装,配置与使用
配置jdk环境 解压缩zookeeper的压缩包 配置 创建data目录 复制zoo_sample.cfg为zoo.cfg 修改confg/zoo.cfg中dataDir=**/data 常用命令 . ...
- 本人亲测-Setup Factory打包教程(整理并优化)
Setup Factory 9 总结 一:安装完毕立刻启动 result = Shell.Execute(SessionVar.Expand("%AppFolder%\\消息助手.exe&q ...
- Altium Designer 编译原理图出现has no driving source警告解决办法
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 作者:struct_mooc 博客地址:https://www.cnblogs.com/stru ...
- Java高并发程序设计学习笔记(一):并行简介以及重要概念
转自:https://blog.csdn.net/dataiyangu/article/details/86211544#_28 文章目录为什么需要并行?反对意见大势所趋几个重要的概念同步(synch ...
- 数据库 (二):MySQL密码策略与用户管理
为了加强安全性,MySQL5.7为root用户随机生成了一个密码可通过# grep "password" /var/log/mysqld.log 命令获取MySQL的临时密码用该密 ...
- 小黄车ofo法人被限制出境,它究竟还能撑多久?
因为季节的原因,现在正是骑车的好时候,而且北京也开通了一条自行车的专用路.但就是在这么好的时候,我们发现,路边的小黄车却越来越少了,而且它的麻烦还不断! ofo法人被限制出境 6月12日消息,据上海市 ...
- STARTUPINFO结构体
typedef struct _STARTUPINFO { DWORD cb; //包含STARTUPINFO结构中的字节数.如果Microsoft将来扩展该结构,它可用作版本控制手段.应用程序必须将 ...
- UVA - 1649 Binomial coefficients (组合数+二分)
题意:求使得C(n,k)=m的所有的n,k 根据杨辉三角可以看出,当k固定时,C(n,k)是相对于n递增的:当n固定且k<=n/2时,C(n,k)是相对于k递增的,因此可以枚举其中的一个,然后二 ...