Swift模式匹配
Swift模式匹配

Swift模式匹配

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通过模式匹配,代码可以提高可读性、更容易维护。

相关文章

1、Swift类型检查运算符(is、as、Type)

2、Swift Switch语句

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注