Swift 5.3 发布!
Swift 5.3 现在正式发布了!🎉
Swift 5.3 继续专注于语言改进、开发者体验以及扩展 Swift 生态系统,从而为编写 Swift 代码创造更多机会。这些由 Amy Tsai 创建的草图笔记,展示了 Swift 5.3 版本的亮点

完整分辨率版本可在 Amy 的推文 上查看
您还可以通过 playground 体验许多这些更新,该 playground 由 Paul Hudson 整理。
语言和标准库
新特性和改进
Swift 5.3 带来了许多语言改进,提升了编写 Swift 代码的人机工程学。这些更新可以帮助您成为更高效的 Swift 程序员,方法是减少样板代码和冗余代码,并使更多功能能够在您可能使用的库中定义。
Swift 5.3 实现了来自 Swift Evolution 流程的以下提案
-
SE-0263 - 添加一个可以访问未初始化存储的
String初始化器 -
SE-0266 - 为
enum类型合成Comparable一致性 -
SE-0267 - 上下文泛型声明中的
where子句 -
SE-0268 - 改进
didSet语义 -
SE-0269 - 增加在不太可能发生引用循环时,
@escaping闭包中隐式self的可用性 -
SE-0276 - 多模式 Catch 子句
-
SE-0277 - Float16
-
SE-0279 - 多个尾随闭包
-
SE-0280 - 枚举 case 作为协议 witness
-
SE-0281 -
@main: 基于类型的程序入口点 -
SE-0282 - 阐明 Swift 内存一致性模型 ⚛︎
-
SE-0285 - 简化向简洁魔法文件字符串的过渡
-
SE-0286 - 尾随闭包的前向扫描匹配
这些特性中的许多特性是由活跃的社区成员提出和实现的:Dianna Ma、Anthony Latsis、Suyash Srijan、Frederick Kellison-Linn 和 Owen Voorhees。感谢你们的贡献!
Swift 5.3 还包括对几个常见编译器限制的修复
-
SR-75 - 现在支持对协议要求的未应用引用
-
SR-7083 -
lazy属性可以定义didSet和willSet访问器 -
SR-8814 - 当泛型类遵循具有关联类型的协议时,可以使用协议要求的默认实现
运行时性能改进
Swift 5.3 显著改进了二进制代码大小和运行时内存使用量。这些改进的测量结果在各个项目中都取得了令人兴奋的成果
-
从 Swift 4 开始,Apple 的 Swift 团队一直在测量使用 Swift 重写的 UIKit 应用程序(使用 Objective-C 编写)的二进制代码大小,该应用程序随 iOS 一起发布。在 Swift 4 中,代码大小约为 Objective-C 版本的 2.3 倍。在 Swift 5.3 中,代码大小已降至 Objective-C 版本的 1.5 倍以下。
-
在 MovieSwiftUI 中,这是一个由 Thomas Ricouard 开发的优秀的开源 SwiftUI 应用程序,与 Swift 5.1 相比,应用程序逻辑代码大小减少了 40% 以上。
-
在一个创建 400 个模型对象数组的测试应用程序中,由于运行时开销造成的堆内存已减少到 Swift 5.1 中使用的堆内存的三分之一以下。
这些测量结果在 WWDC 2020 的 ‘What’s New in Swift’ 演讲中报告。
二进制大小的改进将因使用模式而异。最大的改进在于声明了大量类型的项目,这是通过减小“值函数”(编译器生成的用于创建、复制和销毁值类型的不可见函数)的大小来实现的。这对于 SwiftUI 应用程序尤其有利。
此外,Swift 应用程序现在在运行时具有更低的堆内存开销。由于运行时改进使得这种缓存变得不那么必要,Swift 运行时在启动时缓存的信息更少,以跟踪协议一致性等内容。使用 Swift 编写的应用程序现在应该比使用 Objective-C 编写的相同程序使用更少的堆内存。
开发者体验
编辑代码时的缩进改进
SourceKit 中的自动缩进实现已在此版本中进行了全面修订,修复了过程中的约 50 个反馈报告。特别是,在此版本中,以下情况的自动缩进得到了极大改进
-
涉及闭包的链式方法调用
-
跨越多行的调用参数、形参和集合元素,以及
-
多行
if、guard和while条件
代码补全
Swift 5.3 进一步提高了代码补全的性能和质量
-
与 Swift 5.2 相比,函数体内的重复代码补全调用现在速度提高了 15 倍。这是通过重用在同一文件中先前补全所做的一些计算来实现的。这些速度提升在 Xcode 和 SourceKit-LSP 的用户中都可见。
-
Swift 代码补全现在支持用户定义的有名类型的可调用值 (SE-0253)。代码补全在基本表达式后跟一个左括号时显示调用签名
构建时间改进
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 现在更加健壮
-
构建机器的 SDK 路径会自动识别并重新映射到本地路径。
-
源路径和包含路径可以选择使用
.dSYM路径重映射字典 进行重新映射。
生态系统
Swift Package Manager
资源 (SE-0271)
包现在可以包含运行时需要的资源,例如图像和其他数据文件。资源按目标范围划分,并在构建包时进行处理并嵌入到客户端应用程序中。可以使用 Foundation 的 Bundle API 从源代码访问资源。
特定于 Apple 平台的资源(例如资产目录、情节提要和 CoreData 模型)只能在 Xcode 中构建,但所有平台都支持通用资源。包清单中的新 API 提供了对将哪些源文件视为资源的控制。
本地化 (SE-0278)
包现在可以包含可本地化的内容,例如 .strings 文件和资源的本地化变体。可以使用 .lproj 目录将可本地化的内容添加到包中,并且可以使用 Foundation API 访问这些内容。
二进制依赖项 (SE-0272)
软件包现在可以发布预构建的库(以 XCFrameworks 的形式分发),从而允许依赖于无法以源代码形式分发的库。此功能目前仅在为 Apple 平台构建时可用。软件包清单中的新 API 允许将 XCFrameworks 引用为二进制目标。
有条件的目标依赖项 (SE-0273)
现在可以将软件包目标的依赖项声明为有条件的,这可以用于按平台限制依赖项。这为描述支持多平台的复杂目标依赖项提供了更大的灵活性。
请注意,基于构建配置的条件也是 Swift 演进提案的一部分,但尚未实现,因此不属于 Swift 5.3 的一部分。
下载
官方二进制文件可从 下载,作为与 Xcode 配合使用的工具链,以及 Linux 工具链和 Docker 镜像。Swift 5.3 也包含在 Xcode 12 中。适用于 Windows 的官方工具链将在未来几周内推出。
源代码
Swift 5.3 的开发在以下仓库的 `release/5.3` 分支中进行跟踪
- indexstore-db
- sourcekit-lsp
- swift-tools-support-core
- swift-llbuild
- swift-package-manager
- swift
- swift-cmark
- swift-corelibs-foundation
- swift-corelibs-libdispatch
- swift-corelibs-xctest
- swift-integration-tests
- swift-stress-tester
- swift-syntax
- swift-xcode-playground-support
- llvm-project
标记 `swift-5.3-RELEASE` 指定了构成 Swift 5.3 最终版本的这些仓库中的特定修订版本。
`release/5.3` 分支将保持开放,但在相同的发布管理流程下,以累积下一次发布的更改。