[Swift 深入解析 #9] Swift ABI 稳定性:2019 年应用体积缩小的原因
2019 年 Swift 5 和 iOS 12.2 发布后,应用体积缩小得益于 ABI 稳定性。本文梳理 Swift 运行时从每个应用转移到操作系统的过程,以及模块稳定性和 @frozen 的权衡。
阅读文章精选主题 · 73 篇文章
从基础原理到实践取舍,系统浏览 Swift 文章。
最新文章
2019 年 Swift 5 和 iOS 12.2 发布后,应用体积缩小得益于 ABI 稳定性。本文梳理 Swift 运行时从每个应用转移到操作系统的过程,以及模块稳定性和 @frozen 的权衡。
阅读文章文件句柄或锁这类只有保持唯一才有意义的资源不应被复制。本文介绍如何用 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的陷阱,以及如何通过性能分析器验证。
阅读文章结构化并发回答了谁负责异步工作的结束。本文整理子任务无法离开父作用域的原理、取消信号的传播方式,以及使用Task.detached时需要手动补回的保证。
阅读文章开启Swift 6模式后,并发错误会大量出现,而Sendable通常是核心。本篇整理这个协议的含义:值能否跨越隔离边界,以及按值类型化、不可变化、升级为actor的顺序给出迁移方案。
阅读文章Delegate 和 Closure 都能处理相同的回调需求,但特性不同。本文用同一个示例并列实现,揭示五项实际差异,并总结如何根据事件数量、关系生命周期以及是否需要返回值来选择。
阅读文章actor 是 Swift 的第四种类型,负责保护自身状态。本篇讲解如何将并发访问排队,让编译器发现数据竞争,以及最著名的陷阱:可重入性。
阅读文章await暂停的是函数,而不是线程。本文整理suspension的准确含义:函数将状态保存到堆中,并把线程归还给协作式线程池,以及顺序await为什么不是并行执行。
阅读文章Factory 是一个能在编译时发现依赖注册遗漏的 Swift DI 库。本文以 2026 年 7 月的 3.3.1 为基准,整理基本用法、作用域声明、测试与预览注入,以及它与 Swinject 的区别。
阅读文章面向协议编程(POP)根据类型能做什么来设计类型,而不是看它继承了什么。本文通过Swift示例,总结继承的瓶颈、用协议组合解决问题的方法,以及应避免使用的场景。
阅读文章\.name 不是 map 的简写语法,而是独立类型 KeyPath 的值。本文整理将属性访问转换为值的含义、只读、值类型写入和引用类型写入这三个层级,以及实际应用场景。
阅读文章属性包装器不是 SwiftUI 语法,而是 Swift 5.1 通过 SE-0258 引入的语言功能。本文梳理编译器如何翻译 @Clamped、wrappedValue 和 projectedValue($) 的本质,以及避免滥用的界限。
阅读文章从 Codable 自动合成究竟生成什么,到实际开发中必然遇到的键名不一致、日期格式、嵌套结构、部分失败四种情况的标准处理方案,以及 DecodingError 调试,本文一并整理。
阅读文章map·filter·compactMap·flatMap·reduce 五个函数的区别,取决于闭包返回什么。本文整理了与 for 循环的选择标准、链式调用产生的中间数组,以及 lazy 序列解决的问题。
阅读文章在 Swift 5.5 及更高版本中,将测试函数声明为 async,使用 await 等待结果,然后进行验证。本文还整理了错误验证、旧式回调 API 测试,以及仍需使用 expectation 的情况。
阅读文章关联类型(associatedtype)是协议中预留的类型空位。本文整理著名 generic constraint 错误的原因、SE-0309 和 SE-0346 如何解除限制,以及 primary associated types 的用法。
阅读文章查看 Swift 5.6 之后的代码,会看到协议名称前面出现 some 或 any:some View、any Error、some Collection。以前可以直接把协议名称写在类型位置,但现在编译器会警告或报错,要求添加 any。…
阅读文章第一次在 Swift 代码中看到尖括号 <T> 时,你可能会停顿一下。函数名旁边多了一个大写字母,打开文档后,还会看到类似 func map<T>( transform: (Element) -> T) -> [T] 的签名。泛型是 Swift 进阶的入门关卡……
阅读文章在《闭包》一文中,我们介绍了如何用 [weak self] 打破循环引用,但还留下了一个问题。除了 weak 之外还有 unowned,它们有什么区别,什么时候该用?要回答这个问题,首先要深入了解 ARC 实际是如何运行的。
阅读文章阅读 Swift 相关文章或版本说明时,经常会看到 SE-0296、SE-0345 这样的编号。介绍 async/await 的文章会标注 SE-0296,讨论 if let name 缩写语法时则会标注 SE-0345。这些编号究竟是什么?
阅读文章打开 Swift 标准库,会发现一个显著事实:除了 Int、Double、Bool 等基本类型,String、Array、Dictionary、Set 也全是 struct。在其他语言中理所当然是类的类型,在 Swift 中都是值类型…
阅读文章Swift 中存在一种奇妙的共存:初学者可以在 Playgrounds 中用一行 print("Hello") 开始学习,但同一种语言也用来编写交织着泛型和宏的标准库。面向小学生的编程教育 App(Swift…
阅读文章Swift Copy-on-Write 在赋值值类型时共享存储空间,只有一方被修改时才执行实际复制。本篇将说明这一优化如何保留值语义,同时降低原型模式的作用。
阅读文章使用 Swift 编写代码时,你总会产生一些疑问:为什么可选值这么严格?为什么数组会被复制?为什么会有 guard?逐一深入这些问题,最终会遇到 Swift 从一开始就提出的三个目标:Safe(安全)、Fast(快速)、Expressive(富有表现力)。
阅读文章Swift 静态工厂方法通过名称表达创建意图,并控制返回类型、缓存和实例复用。本文总结选择 static func make 而不是 init 的优缺点,以及它与 GoF 模式的区别。
阅读文章翻开设计模式的书,解释器模式总会在接近最后的位置出现。这是一个很容易因为“这到底什么时候会用到”而略过的模式。
阅读文章你是否曾在不同类中复制粘贴相似逻辑,并想着“这好像不太对”?在 iOS 应用里,当你第三次复制某个页面的数据加载代码时,手就会停下来。
阅读文章从扩展字素簇出发,解释 Swift String 不接受整数索引的原因,并通过实际运行结果确认韩文组合字符串中 Character、Unicode scalar 和 UTF-8 的差异。
阅读文章使用 Swift 开发应用时,我们每天会写几十次类似 for item in array 的循环。由于太过自然,往往要到尝试用 for-in 遍历自定义类型并遇到编译错误后,才会好奇:“这个循环内部到底发生了什么?”
阅读文章Facade Pattern 为由多个对象交织而成的子系统提供一个简单的统一入口。本文以 Swift 用户注册为例,讲解如何集中管理调用顺序,以及它与 Adapter、Proxy、Decorator 的区别。
阅读文章状态模式将各状态的行为和转换集中到对象或 enum 中,减少分散的条件判断。本文介绍重构 Swift 界面状态的步骤与策略模式般的结构如何根据设计意图进行区分。
阅读文章Swift guard 会先处理失败条件,让正常流程保持平坦。通过可执行示例确认它与 if 不同的编译器保证、可选绑定的有效范围,以及 return、throw、continue 的选择标准。
阅读文章Swift 的错误处理工具,会根据处理失败的时机和需要保留的信息发挥不同作用。本文结合执行结果,整理 throws、do-catch、try?、try! 和 Result 的选择方式。
阅读文章这是 Swift 基础系列第 3 篇。本文不罗列语法,而是围绕选择标准整理五种属性。核心问题只有一个:这个值会被存储、被计算,以及何时创建?
阅读文章原型模式通过克隆现有对象,降低创建成本并减少重复配置。本文总结 Swift 值类型复制与类的 NSCopying 有何不同,以及浅拷贝和 Copy-on-Write 在何处介入。
阅读文章学习 Swift 时首先遇到的关卡就是 Optional。String? 的问号、if let、guard let、!、??。语法形式很多,如果分别死记硬背,很容易把规则弄混。
阅读文章抽象工厂会将多个彼此兼容的对象组成产品族,并一次性完成替换。本文以 Swift 主题为例,说明如何避免组合错误,以及如何在抽象工厂和工厂方法之间进行选择。
阅读文章Swift 工厂函数会为创建逻辑赋予表达意图的名称,并让返回类型和复用策略更加灵活。本文总结选择 static func 而不是 init 的标准,以及它与 GoF 工厂方法的区别。
阅读文章在 Swift 代码中,闭包无处不在:排序条件、网络完成处理器、按钮操作,甚至 SwiftUI 的 body。每天都会数十次遇到传递大括号代码块的场景。但要解释“闭包捕获值究竟是什么意思”“[weak self] 为什么要用”以及“为什么要加 @escaping”,很多人却常常说不清楚。
阅读文章适配器模式会将旧版 API 的接口转换为新代码所期待的协议。本文整理了如何在 Swift 中建立转换边界、简化替换与测试,以及它与其他封装模式的区别。
阅读文章开始进行iOS开发后,任何人都可能至少思考过一次:“Apple明明一直在使用Objective-C,为什么还要特意重新创建Swift呢?”
阅读文章使用 Swift 开发应用时,你可能遇到过这样的情况:用 do-catch 捕获了错误,却发现真正显示在屏幕上的消息并不理想。
阅读文章