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-)

相关推荐
CocoaKier4 小时前
你的开发者账号已经被盯上了,如何区分钓鱼邮件
ios·google·apple
FogLetter6 小时前
你不知道的Javascript(上卷) | 第一章:作用域是什么
前端·javascript·编程语言
东坡肘子8 小时前
WWDC 2025:回归务实的一年 | 肘子的 Swift 周报 #089
swiftui·swift·wwdc
Moonbit1 天前
双周报Vlo.74:用于表示错误的 ! 语法被替换为关键字 raise、错误多态支持:高阶函数现可接受带错误的回调
编程语言
Mirageef1 天前
aardio 模块化管理
编程语言
大熊猫侯佩1 天前
Swift 初学者秘技:如何用模块(Module)进一步细粒度控制代码访问控制
swift·apple
iOS阿玮1 天前
苹果审核被拒,其实可以靠回复也能过审
uni-app·app·apple