一图读懂 Swift 5.3

268次阅读  |  发布于3年以前

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 更加强大:

生态

Swift Package Manager

资源(SE-0271)

包现在可以包含运行时所需的资源,例如图像和其他数据文件。资源按 target 确定范围,并在构建程序包时进行处理并嵌入到客户端应用程序中。可以使用 Foundation 的 Bundle API 从源码中访问资源。

Apple 平台特有的资源(例如资源目录,storyboards 和 CoreData 模型)只能在 Xcode 中构建,但是所有平台都支持通用资源。包清单中的新 API 提供了对将哪些源文件视为资源的控制。

本地化(SE-0278)

包现在可以包含可本地化的内容,例如 .strings 文件和资源的本地化变体。可本地化的内容可以使用 .lproj 目录添加到程序包中,并且可以使用 Foundation API 进行访问。

二进制依赖性(SE-0272)

软件包现在可以以 XCFrameworks 形式分发预构建库,从而允许依赖于不能作为源代码分发的库。该功能当前仅在为 Apple 平台构建时可用。包清单中的新 API 允许 XCFrameworks 被引用为二进制目标。

条件目标依赖(SE-0273)

现在可以将软件包目标的依赖项声明为有条件的,可以用来限制平台的依赖项。这为描述支持多个平台的复杂目标依赖关系提供了更大的灵活性。

请注意,基于构建配置的条件也是 Swift Evolution 的一部分,但尚未实现,因此不是 Swift 5.3 的一部分。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8