Swift模式匹配是指使用结构描述(pattern)去判断一个值是否符合某种类型,如果匹配成功,则解构并绑定数值。
Swift常见模式:
1、通配符模式(Wildcard Pattern)
2、标识符模式(Identifier Pattern)
3、值绑定模式(Value-Binding Pattern)
4、元组模式(Tuple Pattern)
5、枚举 case 模式(Enumeration Case Pattern)
6、Optional 模式
7、类型匹配模式(Type-Casting Pattern)
8、表达式模式(Expression Pattern,包括区间)
语法形式
1、通配符模式(_):忽略一个值。
case _:
break
当不关心某个值,仅用于占位时使用。
例如:
case .success(_):
print("成功,但不关心值")
2、标识符模式(Identifier Pattern):将值绑定到名字。
case value:
print(value)
注意:单独使用时,case value会匹配任何值。
3、值绑定类型(let / var)
case let .success(value)
或者
case .success(let value)
通常使用 let,很少使用 var(可变绑定),即使是Binding类型也是使用let。
4、元组模式(Tuple Pattern):匹配元组结构:
let point = (x: 0, y: 5)
switch point {
case (0, let y):
print("x = 0, y = \(y)")
case let (x, y):
print("任意点")
}
也可以部分匹配:
case (_, 0):
print("y = 0")
5、枚举 case 模式:适用于所有枚举,尤其是带关联值的枚举。
enum State {
case idle
case loading
case success(Int)
case failure(Error)
}
例如:
switch state {
case .idle:
...
case .success(let value):
print(value)
case .failure(let error):
print(error)
}
也可以传入Binding值:
case string(Binding<String>,FocusState<Bool>.Binding)
6、Optional可选模式(本质上枚举)。
enum Optional<Wrapped> {
case some(Wrapped)
case none
}
匹配格式:
if case .some(let value) = num
if case .none = num
if case <pattern> = <value>语法表示,当值被匹配成功时,执行代码块。
7、类型匹配模式(is / as):用于运行时类型判断。
switch value {
case is Int:
print("是 Int")
case let s as String:
print("是 String: \(s)")
default:
break
}
8、区间模式
if case 0...10 = number {
print("0 到 10")
}
在switch中:
switch number {
case 0...10:
print("小")
case 11...100:
print("中")
default:
print("大")
}
匹配场景
模式匹配常见于以下几种场景。
1、switch:
switch value {
case pattern:
...
}
2、if case:
if case let .success(value) = result {
print(value)
}
3、guard case:
guard case let .success(value) = result else { return }
4、if let / guard let:Optional语法糖。
if let value = optional
5、for case:
for case let .success(value) in results {
print(value)
}
注意事项
1、匹配case
Swift里,case表示模式(patter),而不是“枚举case”。
当使用if case、guard case以及for case等场景时:
if case 0 = number { }
if case (let x, 0) = point { }
if case is String = value { }
if case let .success(v) = result { }
case表示启动模式匹配,let绑定匹配的值。
常用于Optional、枚举等场景。
如果不关系值,也可以不使用let进行绑定:
if case .success = result {
print("成功")
}
2、枚举匹配通常使用case:
在if、guard、while匹配枚举,for循环模式匹配等匹配场景中,通常使用case:
if case .failure(let error) = result { }
guard case .some(let x) = optional else { return }
case在这里解决的是歧义问题,如果不使用case,语法无法区分这些场景是赋值,还是解包。
case明确告知编译器,这是匹配模式。
总结
Swift通过模式匹配,代码可以提高可读性、更容易维护。
