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

news2024/10/7 2:22:51

在这里插入图片描述

概览

相信初学 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)")
}

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

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

在实际撸码过程中,一旦出现上面的使用情境一些小伙伴们可能就会出现“选择性记忆障碍”:他们彻底忘记了 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 语法的构成,天荒地老永不忘记!

感谢观赏,再会!😎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1663553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【半夜学习MySQL】数据库中的数据类型(含数值类型、文本二进制类型、时间类型、String类型详谈)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 数据类型分类数值类型bit类型tinyint类型int类型float类型decimal类型 文本、二进制类型char类型varchar类型 时间类型Strin…

初识C语言——第十七天

选择语句&#xff1a;switch switch语句&#xff08;整型表达式&#xff09; { 语句项&#xff1a; } 而语句项是什么呢&#xff1f; //是一些case语句&#xff1a; //如下 case 整形常量表达式&#xff1b;常量可以&#xff0c;字符也可以&#xff08;因为字符存储的时…

Java并发编程:用户态、内核态和cache line

文章目录 一、介绍二、java中那些操作使用了内核态三、cache line的概念四、CPU缓存一致性协议 一、介绍 用户态和内核态是操作系统的两种运行状态&#xff0c;它们分别对应于不同的权限级别和访问能力。 用户态&#xff08;User Mode&#xff09;&#xff1a;这是应用程序运…

geotrust企业通配符证书2990

随着时代的变化&#xff0c;人们获取信息的方式由报纸、书籍变为手机、电脑&#xff0c;因此很多企事业单位用户开始在互联网中创建网站来进行宣传&#xff0c;吸引客户。为了维护网站安全环境&#xff0c;保护客户数据&#xff0c;企事业单位也开始使用SSL数字证书&#xff0c…

在做题中学习(55):一维前缀和模板

【模板】前缀和_牛客题霸_牛客网 (nowcoder.com) 题目解释&#xff1a; 注意&#xff1a;下标从1开始的。 l 和 r就是对这n个整数去取一个区间&#xff0c;例如示例一&#xff1a; (1,2) 区间 就是算出1 2 4 中 1&#xff0c;2下标对应值的和&#xff0c;12 3 同理,(2,3) …

煤矿防爆气象传感器

TH-WFB5随着工业技术的不断发展&#xff0c;煤矿作为我国能源领域的重要组成部分&#xff0c;其安全生产问题一直备受关注。在煤矿生产过程中&#xff0c;井下环境复杂多变&#xff0c;瓦斯、煤尘等易燃易爆物质的存在使得井下安全工作尤为重要。为了提高煤矿生产的安全性&…

综合能力 | 误差 | 学习笔记

误差指真值与观测值的差值。 误差分为系统误差&#xff08;消除方法&#xff1a;观测方法、仪器校正、修正等&#xff09;、偶然误差&#xff08;符合正态分布规律&#xff0c;进行计算纠正&#xff09;、粗差&#xff08;一般舍弃&#xff09;。 中误差&#xff08;均方差或标…

YOLO系列笔记(十四)——Compute Canada计算平台及其常见命令介绍

Compute Canada平台及其常见命令介绍 前言优势使用方法1. 检查模块不带版本号带版本号 2. 加载模块3. 检查模块是否加载成功4. 创建虚拟环境5. 编写作业脚本6. 提交作业7. 监控作业状态8. 查看作业开始预计时间9. 查看作业的详细输出10. 取消作业 注意结语 前言 大家好&#x…

十天学会单片机可能吗?单片机入门需要多久?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 十天学“会”单片机&#xf…

每周打靶VulnHub靶机-DEATHNOTE_ 1

Deathnote: 1 靶机传送门 don’t waste too much time thinking outside the box . It is a Straight forward box . 不要浪费太多时间跳出框框思考问题。这是一个很直接的盒子 是不是所有线索都在这个盒子里&#xff1f; 1.信息搜集 使用nmap进行域内存活主机扫描发现target …

Electron学习笔记(三)

文章目录 相关笔记笔记说明 五、界面1、获取 webContents 实例&#xff08;1&#xff09;通过窗口对象的 webContent 属性获取 webContent 实例&#xff1a;&#xff08;2&#xff09;获取当前激活窗口的 webContents 实例&#xff1a;&#xff08;3&#xff09;在渲染进程中获…

【全部更新】2024数维杯A题完整成品代码文章思路结果分享

A题 多源机会信号建模与导航分析 摘要 全球卫星定位系统&#xff08;GPS&#xff09;虽广泛应用于全球定位与导航&#xff0c;但其在室内、隧道以及建筑密集区等复杂环境中的有效性受限。为解决这一局限性&#xff0c;本研究探讨了一种基于机会信号的自主定位导航方法。 机会信…

json返回工具类|世界协调时间(UTC)

一、问题 世界协调时间&#xff08;UTC&#xff09;是一个标准的时间参考&#xff0c;通常被用于跨越不同时区的时间标准。要将 UTC 时间转换为中国时间&#xff08;中国标准时间&#xff09;&#xff0c;你需要将时间加上8个小时&#xff0c;因为中国位于 UTC8 时区。 初中知…

C++类和对象(5)static修饰的静态成员变量函数

1.静态成员函数和静态成员变量的引入 &#xff08;1&#xff09;我们通过以下面的这个例子逐步引出静态的成员变量和成员函数&#xff1a; 我们自己定义一个类&#xff0c;使用这个类创建对象&#xff0c;我们应该如何判断在这个程序执行的过程中&#xff0c;创建了多少个对象…

Measurement and Analysis of Large-Scale Network File System Workloads——论文泛读

ATC 2008 Paper 分布式元数据论文阅读笔记整理 问题 网络文件系统在当今的数据存储中发挥着越来越重要的作用。使用网络文件系统可以降低管理成本&#xff0c;从多个位置可靠地访问的数据。这些系统的设计通常以对文件系统工作负载和用户行为的理解为指导[12&#xff0c;19&a…

Windows密码破解常见手段

mimikatz导出lsass破解 如果域管在成员机器上登录过&#xff0c;那么密码机会保存到lsass.exe进程当中&#xff0c;可以通过mimikatz读取密码 用本地管理员登录本地机器 导出hash reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCred…

四十九坊股权设计,白酒新零售分红制度,新零售策划机构

肆拾玖坊商业模式 | 白酒新零售体系 | 新零售系统开发 坐标&#xff1a;厦门&#xff0c;我是易创客肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 不花钱开3000多家门店&#xff0c;只靠49个男人用一套方法卖白酒…

使用scrollIntoView滚动元素到可视区域

1. 实现效果 点击顶部标签栏&#xff0c;让对应的内容出现在可视区域&#xff1a; 2. scrollIntoView () scrollIntoView 是一个内置的 JavaScript 方法&#xff0c;用于将元素滚动到视口可见的位置。它通常用于用户界面中&#xff0c;以便用户能轻松看到特定的元素。此方…

搭建Docker私服镜像仓库Harbor

1、概述 Harbor是由VMware公司开源的企业级的Docker Registry管理项目&#xff0c;它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。 Harbor 的所有组件都在 Dcoker 中部署&#xff0c;所以 Harbor 可使用 Docker Compose 快速部署。 …

实战中使用 QEMU 进行内网穿透

前言 阅读 https://xz.aliyun.com/t/14052 《使用 QEMU 进行内网穿透&#xff1f;》 https://securelist.com/network-tunneling-with-qemu/111803/ 《Network tunneling with… QEMU?》 我将此项技术应用到实战中&#xff0c;取得不错的效果&#xff0c;但是也遇到很多坑&am…