Swift 初学者趣谈:一招教你记住模式匹配 if case let 的语法,永不忘记

概览

相信初学 Swift 头发茂盛的小伙伴们都对 Swift 简洁且极富表现力的语法倾心不已。不过凡事皆有例外,模式匹配(Pattern Matching)的语法就是其中之一。

在本篇博文中,您将学到如下内容

  1. 诡异的 if case let 语法,怎么才能记得住呢?
  2. 触类旁通:一招制敌!

"书到用时方恨少,事非经过不知难",相信只要学完本课的同学们一定终身不会再忘记 Swift 模式匹配的语法格式!

那还等什么呢?Let's go!!!;)


1. 诡异的 if case let 语法,怎么才能记得住呢?

模式匹配(Pattern Matching)是编程语言为我们提供的更简洁、更便利的比较、检查和解析数据的方式。


更多关于模式匹配的介绍,请小伙伴们移步如下链接观赏进一步的内容:


模式匹配具有极其丰富的表现力,它可以用来描述复杂的数据解析场景。一种常见的情况就是带关联类型的枚举。


在下面的代码中我们创建了一个描述错误的枚举,并用关联类型进一步让错误更加"栩栩如生":

swift 复制代码
enum MyError: Error {
    case textTooShort(actual: Int, min: Int)
}

let MIN_LEN = 5
let text = "wo"

do {
    if text.count < MIN_LEN {
        throw MyError.textTooShort(actual: text.count, min: MIN_LEN)
    }
} catch let my_error as MyError {
    if case MyError.textTooShort(let actual, let min) = my_error {
        print("输入文字长度(\(actual))太短了,不能小于(\(min))")
    } else {
        print("其它 MyError: \(my_error)")
    }
} catch {
    print("Other ERR: \(error)")
}

运行结果如下所示:

输入文字长度(2)太短了,不能小于(5)

可以看到,在 Swift 中为了能够抽取出 MyError 错误中特定的关联信息,我们需要用模式匹配的方式借助一种看似非常"怪异"的语法 if case let 来完成:

swift 复制代码
if case MyError.textTooShort(let actual, let min) = my_error {
    print("输入文字长度(\(actual))太短了,不能小于(\(min))")
} else {
    print("其它 MyError: \(my_error)")
}

这种语法有如下几个特点:

  1. 被匹配对象实例必须放在等号右侧;
  2. 等号左侧的内容被称为模式构造器,它用来匹配对象中实际的关联类型;

在实际撸码过程中,一旦出现上面的使用情境一些小伙伴们可能就会出现"选择性记忆障碍":他们彻底忘记了 if case let 中等号左侧和右侧到底要放些什么东东!

更何况,这种模式匹配语法还有一种变形的写法,即把 let 关键字放在外面:

swift 复制代码
if case let MyError.textTooShort(actual, min) = my_error {
    print("输入文字长度(\(actual))太短了,不能小于(\(min))")
} else {
    print("其它 MyError: \(my_error)")
}

这无疑进一步加剧了小伙伴们"选择性记忆障碍"的顾此失彼,那么我们又该何去何从呢?

2. 触类旁通:一招制敌!

在此,我们为大家提供一种对于这种匹配语法非常好记的小窍门,那就是联想大法

回忆一下,除了在 if case let 中我们会用到模式匹配,在 switch...case 语法块中模式匹配同样起到举足轻重的作用:

swift 复制代码
do {
    if text.count < MIN_LEN {
        throw MyError.textTooShort(actual: text.count, min: MIN_LEN)
    }
} catch let my_error as MyError {
    switch my_error {
    case .textTooShort(let actual, let min):
        print("输入文字长度(\(actual))太短了,不能小于(\(min))")
    default:
        print("其它 MyError: \(my_error)")
    }
} catch {
    print("Other ERR: \(error)")
}

如上代码所示:我们用 switch...case 语法重构了之前的代码,运行结果自然是一毛一样。不过,从上面的 switch...case 语法中大家是否能看到一丢丢端倪:switch...case 每个单项的语法和之前 if case let 等号左边的内容是完全一致的。

swift 复制代码
// if case let 版本
if case .textTooShort(let actual, let min) = my_error {
    print("输入文字长度(\(actual))太短了,不能小于(\(min))")
} else {
    print("其它 MyError: \(my_error)")
}

// switch...case 版本
switch my_error {
case .textTooShort(let actual, let min):
    print("输入文字长度(\(actual))太短了,不能小于(\(min))")
default:
    print("其它 MyError: \(my_error)")
}

大家只要下意识的将 switch 语句后面的值放到 if case let 等号右侧即可!

所以,大家了然了吗?如果小伙伴们能够记住 switch...case 模式匹配的语法,那么 if case let 自然也不在话下!下次如果大家忘记了如何构建 if case let 语法,那么不妨回想一下 switch...case 的语法哦!

最后,switch...case 也支持 let 关键字"外写"的形式:

swift 复制代码
if case let MyError.textTooShort(actual, min) = my_error {
    print("输入文字长度(\(actual))太短了,不能小于(\(min))")
} else {
    print("其它 MyError: \(my_error)")
}

现在,小伙伴们对模式匹配中 if case let 的语法结构一定变的"刻骨铭心"了吧,我们又为大家坚守住了几万根茂密的黑丝(别想歪哦),棒棒哒!💯

总结

在本篇博文中,我们讨论了如何在 Swift 语言中巧妙记住模式匹配中 if case let 语法的构成,天荒地老永不忘记!

感谢观赏,再会!8-)

相关推荐
神经星星1 小时前
登 Science,David Baker 团队提出无序区域结合蛋白设计新方法,专攻不可成药靶点
人工智能·机器学习·编程语言
神经星星2 小时前
【TVM 教程】向 Relay 中添加算子
人工智能·开源·编程语言
无知的前端2 小时前
一文读懂 - Swift 和 Objective-C 创建对象时内存分配机制
ios·性能优化·swift
杂雾无尘3 小时前
分享一个让代码更整洁的 Xcode 开发小技巧:设置文件目标平台
ios·swift·apple
大熊猫侯佩14 小时前
WWDC 25 极地冰原撸码危机:InlineArray 与 Span 的绝地反击
swift·apple·wwdc
秋难降19 小时前
零基础学习SQL(一)-----关系型数据库DDL和图形化界面工具Datagrip
数据库·mysql·编程语言
Jooolin1 天前
【C++】STL:Stack详解
c++·ai编程·编程语言
Jooolin1 天前
【C++】C++中的模板是个啥机制?好用吗?
c++·ai编程·编程语言
东坡肘子1 天前
Xcode 26 beta 4,要崩我们一起崩 | 肘子的 Swift 周报 #096
swiftui·swift·apple
CocoaKier2 天前
推荐一个历代iPhone设备型号网站,比维基百科好用
ios·apple