Swift 学习路线
从基础原理到实践决策,系统理解Swift 学习路线。
LANGUAGE · 52 ARTICLES
从基础原理到实践决策,系统理解Swift 与 Objective-C。
主题地图
从基础原理到实践决策,系统理解Swift 学习路线。
从基础原理到实践决策,系统理解类型与内存。
从基础原理到实践决策,系统理解Swift 并发。
从基础原理到实践决策,系统理解Objective-C。
从这里开始
从基础通往下一步的导读。
学习 Swift 时首先遇到的关卡就是 Optional。String? 的问号、if let、guard let、!、??。语法形式很多,如果分别死记硬背,很容易把规则弄混。
阅读文章在《闭包》一文中,我们介绍了如何用 [weak self] 打破循环引用,但还留下了一个问题。除了 weak 之外还有 unowned,它们有什么区别,什么时候该用?要回答这个问题,首先要深入了解 ARC 实际是如何运行的。
阅读文章await暂停的是函数,而不是线程。本文整理suspension的准确含义:函数将状态保存到堆中,并把线程归还给协作式线程池,以及顺序await为什么不是并行执行。
阅读文章全部文章
2019 年 Swift 5 和 iOS 12.2 发布后,应用体积缩小得益于 ABI 稳定性。本文梳理 Swift 运行时从每个应用转移到操作系统的过程,以及模块稳定性和 @frozen 的权衡。
阅读文章同步与异步关注由谁负责任务完成,阻塞与非阻塞关注是否立即返回控制权。由于两个轴彼此独立,2×2 的四种组合全部存在;本文结合 Swift 示例说明原因。
阅读文章文件句柄或锁这类只有保持唯一才有意义的资源不应被复制。本文介绍如何用 Swift 5.9 的 ~Copyable 将禁止复制写入类型,并整理 borrowing、consuming、inout 三种传递方式及其适用场景。
阅读文章Swift 5.9 的宏是插入编译器的代码生成插件。本篇总结了接收语法树并返回代码的原理、freestanding(#) 与 attached(@) 两种分支,以及自行创建宏所需付出的成本。
阅读文章struct 的大小并不是属性大小的简单总和。本文整理了 size、stride、alignment 与 padding 的实测,以及利用 extra inhabitant 的 Optional 和 64 位 existential container。
阅读文章方法调用会编译为直接调用、vtable或objc_msgSend。本文整理final和private提升性能的机制、协议extension的陷阱,以及如何通过性能分析器验证。
阅读文章添加观察者的瞬间,运行时会将对象的类动态替换为子类。本文梳理 isa-swizzling 的工作方式、class 为什么会说谎,以及不经过 setter 时不会收到通知的条件。
阅读文章结构化并发回答了谁负责异步工作的结束。本文整理子任务无法离开父作用域的原理、取消信号的传播方式,以及使用Task.detached时需要手动补回的保证。
阅读文章开启Swift 6模式后,并发错误会大量出现,而Sendable通常是核心。本篇整理这个协议的含义:值能否跨越隔离边界,以及按值类型化、不可变化、升级为actor的顺序给出迁移方案。
阅读文章分类无法添加 ivar,但可以通过 Associated Objects 关联值。本文总结值存储在对象旁边的侧表中的原理、分类属性的完整实现,以及只需注意 assign 的内存策略。
阅读文章Delegate 和 Closure 都能处理相同的回调需求,但特性不同。本文用同一个示例并列实现,揭示五项实际差异,并总结如何根据事件数量、关系生命周期以及是否需要返回值来选择。
阅读文章actor 是 Swift 的第四种类型,负责保护自身状态。本篇讲解如何将并发访问排队,让编译器发现数据竞争,以及最著名的陷阱:可重入性。
阅读文章