概览
相信初学 Swift 头发茂盛的小伙伴们都对 Swift 简洁且极富表现力的语法倾心不已。不过凡事皆有例外,模式匹配(Pattern Matching)的语法就是其中之一。
在本篇博文中,您将学到如下内容
- 概览
- 1. 诡异的 if case let 语法,怎么才能记得住呢?
- 2. 触类旁通:一招制敌!
- 总结
“书到用时方恨少,事非经过不知难”,相信只要学完本课的同学们一定终身不会再忘记 Swift 模式匹配的语法格式!
那还等什么呢?Let‘s go!!!😉
1. 诡异的 if case let 语法,怎么才能记得住呢?
模式匹配(Pattern Matching)是编程语言为我们提供的更简洁、更便利的比较、检查和解析数据的方式。
更多关于模式匹配的介绍,请小伙伴们移步如下链接观赏进一步的内容:
- Swift 入门之自定义类型的模式匹配(Pattern Matching)
对应的视频课也一并放出,欢迎观看:
Swift趣味开发征服模式匹配(Pattern Match)
模式匹配具有极其丰富的表现力,它可以用来描述复杂的数据解析场景。一种常见的情况就是带关联类型的枚举。
关于 Swift 中枚举类型的更多介绍,请恣意观赏如下视频课:
Swift 基本功修炼:深入浅出 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 来完成:
if case MyError.textTooShort(let actual, let min) = my_error {
print("输入文字长度(\(actual))太短了,不能小于(\(min))")
} else {
print("其它 MyError: \(my_error)")
}
这种语法有如下几个特点:
- 被匹配对象实例必须放在等号右侧;
- 等号左侧的内容被称为模式构造器,它用来匹配对象中实际的关联类型;
在实际撸码过程中,一旦出现上面的使用情境一些小伙伴们可能就会出现“选择性记忆障碍”:他们彻底忘记了 if case let 中等号左侧和右侧到底要放些什么东东!
更何况,这种模式匹配语法还有一种变形的写法,即把 let 关键字放在外面:
if case let MyError.textTooShort(actual, min) = my_error {
print("输入文字长度(\(actual))太短了,不能小于(\(min))")
} else {
print("其它 MyError: \(my_error)")
}
这无疑进一步加剧了小伙伴们“选择性记忆障碍”的顾此失彼,那么我们又该何去何从呢?
2. 触类旁通:一招制敌!
在此,我们为大家提供一种对于这种匹配语法非常好记的小窍门,那就是联想大法!
回忆一下,除了在 if case let 中我们会用到模式匹配,在 switch…case 语法块中模式匹配同样起到举足轻重的作用:
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 等号左边的内容是完全一致的。
// 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 关键字“外写”的形式:
if case let MyError.textTooShort(actual, min) = my_error {
print("输入文字长度(\(actual))太短了,不能小于(\(min))")
} else {
print("其它 MyError: \(my_error)")
}
现在,小伙伴们对模式匹配中 if case let 的语法结构一定变的“刻骨铭心”了吧,我们又为大家坚守住了几万根茂密的黑丝(别想歪哦),棒棒哒!💯
总结
在本篇博文中,我们讨论了如何在 Swift 语言中巧妙记住模式匹配中 if case let 语法的构成,天荒地老永不忘记!
感谢观赏,再会!😎