Swift学习25:Swift中的模式和模式匹配

张建 lol

模式

  • 模式代表 单个值或复合值结构

  • 可以用模式来匹配各种各样的值,例如:(x,y) 匹配 元组(1,2)

  • 可以从复合值中取出部分或全部值,然后把值绑定一个常量或变量,例如:(let x,y) 提取 (1,2)

模式分类

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

  • 第一种模式用于解构简单的常量、变量和可选绑定中的值

  • 第二种模式用于全模式匹配。

模式分类:

  • 通配符模式(Wildcard Pattern)
  • 标识符模式(Identifier Pattern)
  • 值绑定模式(Value-Binding Pattern)
  • 元组模式(Tuple Pattern)
  • 枚举用例模式(Enumeratinal Case Pattern)
  • 可选项模式(Optional Pattern)
  • 类型转换模式(Type-Casting Pattern)
  • 表达式模式(Expression Pattern)

通配符模式(Wildcard Pattern)

  • 通配符模式(Wildcard Pattern) 用一个下划线 _ 构成,用于匹配并忽略任何职
1
2
3
for _ in 1...3 {

}

标识符模式(Identifier Pattern)

  • 标识符模式匹配任何值,并将匹配的值和一个变量或常量绑定起来
1
let someValue = 42

值绑定模式(Value-Binding Pattern)

  • 把匹配到的值绑定给一个 变量let或常量var
1
2
3
4
5
6
let point = (2,3)
switch point {
// 将 point 中的元素绑定到 x 和 y
case let (x,y):
print("\(x),\(y)")
}

元组模式(Tuple Pattern)

  • 元组模式由逗号分割,具有零个或多个模式的列表,由一对圆括号括起来。
1
2
3
4
let points = [(0,0),(0,1),(1,1)]
for (x,0) in points {
print("")
}

枚举用例模式(Enumeratinal Case Pattern)

  • 匹配现有某个枚举类型的某个用例,体现在 switchcase 标签中,及 if、while、guard for incase

可选项模式(Optional Pattern)

  • 匹配 Optional<Wrapped> 枚举在 some<Wrapped> 中包装的值

  • 可选项模式为 for in 语句提供了一种迭代数组的简便方式,只为数组中的非 nil 元素执行循环体

1
2
3
4
5
6
7
8
let someNum: Int? = 10
if case .some(let x) = someNum {
print(x)
}

if case let x? = someNum {
print(x)
}

类型转换模式(Type-Casting Pattern)

  • 有两种:is模式as模式is 模式只出现在 switch 语句 case 标签中

    • is 类型:仅当一个值类型在运行时和 is模式 右边指定的类型一致,或子类下,才匹配值,没有返回类型

    • 模式 as 类型:仅当一个值类型在运行时和 as模式 右边指定的类型一致,或子类下,才匹配值,如果匹配成功,被转换成 as模式右边指定的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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 flightHeight:Int
}
let animals:[Any] = [Dog(runSpeed:40),Bird(flightHeight:500)]
for animal in animals {
switch animal{
case let dog as Dog:
print("\(dog.name) run at \(dog.runSpeed)")
case let bird as Bird:
print("\(bird.name) swip at \(bird.flightHeight)")
default:
break
}
}

表达式模式(Expression Pattern)

  • 表达式模式代表表达式的值,只出现在 switch 语句中的 case 标签中

  • 可重载 ~= 运算符来提供自定义的表达式匹配行为

  • 自定义类或结构体类型 默认也是无法进行表达式模式匹配的,也需要重载 ~= 运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct Employee{
var salary:Int
}
func ~= (left:ClosedRange<Int>,right:Employee) -> Bool{
return left.contains(right.salary)
}
var e: Employee = Employee(salary:2000)
switch e{
case 0...1000:
print("吃不饱")
case 1000...5000:
print("勉强度日")
default:
break
}

  • Post title:Swift学习25:Swift中的模式和模式匹配
  • Post author:张建
  • Create time:2023-02-23 21:36:05
  • Post link:https://redefine.ohevan.com/2023/02/23/Swift课程/Swift学习25:Swift中的模式和模式匹配/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.