Swift 5.3 稳定版已于上周正式发布,此版本继续专注于语言改进、提升开发者体验以及扩展 Swift 生态系统,以让 Swift 适用于更多场景。Amy Tsai 手绘的素描笔记介绍了 Swift 5.3 主要新特性:

语言和标准库
新特性和改进
Swift 5.3 带来了许多语言方面的改进,从而改善了编写 Swift 代码的体验。这些更新通过减少样板代码和冗余代码,并在可能使用的库中定义更多功能来帮助开发者成为更有生产力的 Swift 程序员。
Swift Evolution 流程中的提案在 Swift 5.3 中得以实现:
- SE-0263 - Add a String Initializer with Access to Uninitialized Storage
- SE-0266 - Synthesized Comparable conformance for enum types
- SE-0267 - where clauses on contextually generic declarations
- SE-0268 - Refine didSet Semantics
- SE-0269 - Increase availability of implicit self in @escaping closures when reference cycles are unlikely to occur
- SE-0276 - Multi-Pattern Catch Clauses
- SE-0277 - Float16
- SE-0279 - Multiple Trailing Closures
- SE-0280 - Enum cases as protocol witnesses
- SE-0281 - @main: Type-Based Program Entry Points
- SE-0282 - Clarify the Swift memory consistency model ??
- SE-0285 - Ease the transition to concise magic file strings
- SE-0286 - Forward-scan matching for trailing closures
Swift 5.3 还修复了几个编译器限制的问题:
- SR-75 - Unapplied references to protocol requirements are now supported
- SR-7083 - lazy properties can define didSet and willSet accessors
- SR-8814 - Generic classes can use default implementations of protocol requirements when conforming to protocols with associated types
改进 runtime 性能
Swift 5.3 显著改善了二进制代码大小和 runtime 内存使用情况,这些改进也在多个项目中得到了验证:
- 从 Swift 4 开始,Apple 的 Swift 团队一直通过 iOS 附带的 UIKit 应用(用 Objective-C 编写)来测量 Swift 重写的二进制代码大小。Swift 4 的代码量约为 Objective-C 版本的 2.3 倍,到了 Swift 5.3 下降到 1.5 倍以下
- 基于 SwiftUI 的开源应用 MovieSwiftUI,与 Swift 5.1 相比,使用 Swift 5.3 重写的应用逻辑代码量减少了 40% 以上
- 在创建包含 400 个模型对象的数组的测试应用程序中,由于 runtime 开销而导致的堆内存比 Swift 5.1中使用的堆内存少 2/3
开发体验
改进编辑代码时的缩进效果
此版本全面修订了 SourceKit 中的自动缩进实现,在此过程中修复了约 50 个反馈报告。特别是以下情况的自动缩进得到了很大改进:
- 涉及闭包的链式方法调用
- 调用跨越多行的参数和集合元素
- 多行的if,guard和while条件
代码补全
- 与 Swift 5.2 相比,现在在函数体内重复执行代码补全调用的速度提升了 15 倍。这是通过在同一文件中重用先前完成的一些计算来实现的。这些优化将在 Xcode 和 SourceKit-LSP 中均可用
- Swift 代码补全现在支持用户定义的 nominal 类型的可调用值 (SE-0253)。代码补全显示了在基本表达式后加上圆括号后的调用签名
优化构建时间
Swift 5.3 进一步优化了代码补全性能和质量:
- 通过避免跨源文件的重复编译工作,并更准确地标识与以前的构建相比未更改的代码,从而缩短增量构建时间
- 通过修复编译器的行为对声明顺序或嵌套敏感的多种情况,提高了正确性
- 使用从另一个库导入的具有大量属性和函数的类型的代码,可以更快地进行编译
此外还有关于调试、Swift 包管理以及编译器诊断方面的更新,详情查看 发布公告。