Swift 5.3 正式发布,Amy Tsai 绘制了一张素描图,列出了 Swift 5.3 的主要新特性。这张图描述了 Swift 5.3 的一些新特性以及目标:继续专注于语言改进,开发体验以及扩展 Swift 生态系统,以让 Swift 适用于更多场景。
Swift 5.3 在语言方面做了不少改进,改善了 Swift 编码体验。这些更新的重点是减少样板和冗余代码,以及在标准库中定义更多功能,从而提高 Swift 程序员的生产力。
Swift Evolution 中的以下条款在 Swift 5.3 中得以实现:
Swift 5.3 还修复了几个常见的编译器限制问题:
Swift 5.3 显著改善了进进制代码大小和运行时内存使用率。这些改进所带来的成果通过多个项目得到了验证:
二进制大小的改进因使用方式而有所不同。这种改进对通过减小“值函数”的大小来声明大量类型的项目意义特别重大,“值函数”是编译器为创建,复制和销毁值类型而生成的不可见函数。这对 SwiftUI 应用程序特别有利。
此外,Swift 应用程序现在在运行时的堆内存开销比较低。Swift 运行时在运行时会缓存较少的信息以跟踪协议一致性之类的信息,而运行时的改进使这类缓存的必要性降低。现在,用 Swift 编写的应用程序比使用 Objective-C 编写的其他程序所使用的堆内存更少。
Swift 5.3 修改了 SourceKit 中的自动缩进实现,在以下几种情形下,自动缩进有了很大的改进:
Swift 5.3 进一步优化了代码补全的性能和质量:
Swift 5.3 为编译器如何处理 Swift 代码中的声明引入了新策略。这些更改带来了一些显著的优化:
这些优化是通过在编译器中更广泛地采用新的集中式框架来实现的,该框架可记录细粒度的依赖项信息,缓存可能需要重复进行的昂贵计算结果,并自动在 Swift 代码中检测依赖项周期。
Swift 5.3 在 Swift 5.2 的诊断优化基础上,又进一步提高了错误消息的质量和准确性,尤其是在 SwiftUI 代码中。更具体地说,Swift 5.3 现在已完成向新诊断体系结构的过渡!
5.3 中的许多诊断优化都涉及复杂的泛型代码,其中泛型参数会有一些错误的情况,例如缺少一致性。例如,考虑以下代码:
struct FormList<FieldID> {
init<Data: Collection>(_ data: Data) where Data.Element: Identifiable,
FieldID == Data.Element.ID { ... }
}
struct Field {
let id: String
}
func createForm(fields: [Field]) {
let form = FormList(fields)
}
在 Swift 5.2 中,编译器会报告了一个非常隐秘的错误消息:
error: expression type 'FormList<_>' is ambiguous without more context
let form = FormList(fields)
^~~~~~~~~~~~~~~~
在 Swift 5.3 中,编译器可以正确报告问题,并提供有用的注释:
error: initializer 'init(_:)' requires that 'Field' conform to 'Identifiable'
let form = FormList(fields)
^
note: where 'Data.Element' = 'Field'
init<Data: Collection>(_ data: Data) where Data.Element: Identifiable,
^
Swift 5.3 为运行时错误提供了更好的错误消息。当调试信息可用时,调试器现在将在标准库中显示陷阱的原因,而不仅仅是显示不透明的无效指令崩溃。
现在,当调试在不同计算机上编译的二进制文件时,LLDB 更加强大:
包现在可以包含运行时所需的资源,例如图像和其他数据文件。资源按 target 确定范围,并在构建程序包时进行处理并嵌入到客户端应用程序中。可以使用 Foundation 的 Bundle API 从源码中访问资源。
Apple 平台特有的资源(例如资源目录,storyboards 和 CoreData 模型)只能在 Xcode 中构建,但是所有平台都支持通用资源。包清单中的新 API 提供了对将哪些源文件视为资源的控制。
包现在可以包含可本地化的内容,例如 .strings 文件和资源的本地化变体。可本地化的内容可以使用 .lproj 目录添加到程序包中,并且可以使用 Foundation API 进行访问。
软件包现在可以以 XCFrameworks 形式分发预构建库,从而允许依赖于不能作为源代码分发的库。该功能当前仅在为 Apple 平台构建时可用。包清单中的新 API 允许 XCFrameworks 被引用为二进制目标。
现在可以将软件包目标的依赖项声明为有条件的,可以用来限制平台的依赖项。这为描述支持多个平台的复杂目标依赖关系提供了更大的灵活性。
请注意,基于构建配置的条件也是 Swift Evolution 的一部分,但尚未实现,因此不是 Swift 5.3 的一部分。
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8