+-
“开源资讯”Swift 5.3稳定版发布,性能改进和增加体验

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 包管理以及编译器诊断方面的更新,详情查看 发布公告。