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 天前
Swift 6.4 的 Ref / MutableRef 大揭秘:给值类型开一扇“安全的小窗”
ios·swift·编程语言
大熊猫侯佩2 天前
WWDC26 SwiftUI 进化之路:砸碎黑盒,彻底迎来开发自由!
ios·swiftui·swift
游戏开发爱好者82 天前
iPhone真机调试有哪些方法?一次定位推送权限问题时整理出来的几种方案
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
大熊猫侯佩2 天前
WWDC26 最被忽视的王炸:告别“伪并发”陷阱,Swift 6.4 的 async defer
ios·swift·编程语言
Flywith243 天前
开源项目:把本地视频转成 Live Photo 并导入 Apple Photos
app·mac·apple
2601_951645783 天前
Linux 编程语言全解析:C、C++、Python、Go、Rust 谁更强?
linux·python·go·c·编程语言
92year4 天前
Xcode 27 AI Agent 实测:苹果把 Claude、ChatGPT、Gemini 都塞进了 IDE
agent·ai编程·xcode·apple·wwdc
宜昌未来智慧谷4 天前
WWDC 2026开发者视角解读:Siri独立App的技术架构与第三方AI模型接入机制
人工智能·架构·apple·wwdc·gemini
人月神话-Lee4 天前
WWDC26 深度解析:如何在 iOS 27 中打造“秒开”的相机体验
ios·swift·相机·wwdc·用户体验
Tr2e5 天前
🐱 从 0 到 1:用 Swift 手搓一个 macOS 桌面宠物(附源码)
macos·ios·swift