Swift 5.7 现已正式发布!Swift 5.7 包括对语言和标准库的重大补充,对编译器的增强以获得更好的开发者体验,对 Swift 生态系统中的工具(包括 SourceKit-LSP 和 Swift Package Manager)的改进,对 Windows 支持的完善,等等。
Swift 5.7是整个Swift社区成员无数次贡献的结晶。感谢社区中的每一个人,感谢你们在Swift论坛上的讨论、错误报告、拉动请求、教育内容以及更多的贡献
如果你是 Swift 的新手,《Swift 编程语言》是官方的 Swift 指南,已经针对 5.7 版本进行了更新。Swift社区维护着一些翻译版本。它也可以在苹果图书商店免费获得。
语言和标准库
Swift 5.7的语言和标准库有许多改进:
- 为常见的模板代码提供了新的速记语法,包括
if let语句和多语句封闭类型注释 - 取消了长期存在的语言限制,使通用编程更加无缝。
- 通过新的注解和选入诊断,增强了数据竞赛的安全性
- 分布式环境中的演员隔离
- 改进了一套现有指针API的可用性
- 全新的语言支持和字符串处理的API
这些功能中的大部分都在WWDC22上讨论过,并在之前的博文《WWDC22的Swift语言公告》中介绍过。你也可以在Swift Evolution 附录中找到语言和标准库 Swift Evolution 建议的完整列表。
开发者体验
新的泛型实现
除了上述针对泛型工作的语言改进之外,类型检查器的泛型实现也从头开始重写,并对正确性和性能进行了改进。
新的实现修复了许多长期存在的错误,主要与处理复杂的同类型要求有关,例如对集合的SubSequence 相关类型的同类型要求,以及利用定义要求的CaseIterable 协议的代码Self.Element == Self 。
新的泛型实现也提高了性能。在协议和关联类型的某些配置下,类型检查时间在Swift 5.6中会呈指数级增长,但现在在Swift 5.7中是线性的。
自动引用计数的改进
在 Swift 5.7 中,通过指定新的规则,在允许优化的情况下缩短变量的寿命,ARC 行为变得更可预测、更方便用户、更有性能。为了执行这些规则,编译器采用了一种新的内部表述,跟踪每个变量的词法范围。这涉及到更新现有的优化和实现几个新的优化。现在,依赖于扩展变量寿命的最常见的编程模式是安全的,不需要程序员明确使用withExtendedLifetime() 。这可以保护你免于出现难以诊断的寿命错误,这些错误只在运行时出现在优化的构建中。它还允许引入更强大的优化而不破坏现有的源代码。
代码补全
函数调用参数、变量和全局函数的代码补全现在已经紧密地集成到Swift的类型检查器中。这使得代码完成能够在模棱两可的代码或有错误的代码内提供更准确的结果。
如果在下例中的+ 之后完成,代码完成现在会报告int 和string 与周围环境相匹配,允许编辑器将这些结果排在高于array 的位置:
func makeIntOrString() -> Int {}
func makeIntOrString() -> String {}
let array = [4, 2]
let int = 42
let string = "Hello World!"
makeIntOrString() +
如果在下面的例子中完成缺失的参数,代码完成现在只提示secondInt 参数标签而省略secondString:
func add(_ firstInt: Int, secondInt: Int) {}
func add(_ firstString: String, secondString: String) {}
add(1, )
生态系统
SourceKit-LSP
SourceKit-LSP 获得了一些改进,以支持Swift for Visual Studio Code 扩展的发布。
现在,在对Package.swift 、compile_commands.json 或compile_flags.txt 进行更改后,将重新计算编译器参数。这确保了语义功能,如代码完成或实时问题,在这些更改后继续正确工作。
如果在同一个Visual Studio Code工作区打开了多个SwiftPM项目,SourceKit-LSP可以在一个服务器实例中管理它们。在不同的SwiftPM项目的文件之间切换时,语言服务器不再需要重新启动,这就减少了在一个文件的语义功能变得可用之前的延迟。
Swift 包管理器
以下针对 SwiftPM 的 SwiftEvolution提案已被接受并在 Swift 5.7 中实施:
- SE-0292:包注册服务
- SE-0303:构建工具插件和 SE-0332:Comannd 插件,这些插件在 Swift 5.6 中首次推出,现已进一步完善并通过 Xcode 提供。
- SE-0339:用于消除歧义的模块别名
分布式演员库
基于 SE-0336:Distributed Actor Isolation,一个用于在 Swift 中构建分布式系统的服务器库已被开放源代码。该库提供了一个点对点集群角色系统的实现,包括集群管理、故障检测以及与服务发现的集成。
Windows 平台
Swift 5.7 对 Windows 的支持有了以下改进:
- Windows 工具链已完全采用 swift-driver 作为编译器驱动程序,C++ 驱动程序不再被打包,也不再作为备用程序提供。
- 安装程序在部署模块地图和打包文件方面更加稳健,从而减少了安装程序下载的大小。
- 在新的更小的下载中加入了API消化器和其他工具。
- 通过删除不必要的路径组件,SDK的布局得到了进一步的精简。
- 随着支持ARM64和X86目标以及X64的工作继续进行,开发者库被重组以允许多架构的安装。
- 对Swift标准库以外的静态Swift库的初步支持已经实现,并可与Windows上的CMake和Bazel等构建工具一起使用。
下载
官方二进制文件可从Swift.org 下载,用于Xcode、Windows和Linux。Swift 5.7编译器也包含在Xcode 14中(apps.apple.com/app/xcode/i…
您还可以为 Amazon Linux 2 和 CentOS 7 安装 RPM,仅供实验使用。请提供您的反馈。使用下面的说明进行RPM安装。
亚马逊Linux 2
$ curl https://download.swift.org/experimental-use-only/repo/amazonlinux/releases/2/swiftlang.repo > /etc/yum.repos.d/swiftlang.repo
$ amazon-linux-extras install epel
$ yum install swiftlang
CentOS 7
$ curl https://download.swift.org/experimental-use-only/repo/centos/releases/7/swiftlang.repo > /etc/yum.repos.d/swiftlang.repo
$ yum install epel-release
$ yum install swiftlang
Swift 进化附录
以下语言、标准库和 Swift 包管理器提案通过Swift 进化过程被接受并在 Swift 5.7 中实施。
并发
- SE-0302:Sendable 和 @Sendable 闭包
- SE-0329:时钟、瞬间和持续时间
- SE-0336:分布式角色隔离
- SE-0338:阐明非角色隔离的异步函数的执行情况
- SE-0340:从异步属性中不可用
- SE-0343:顶层代码中的并发性
- SE-0344:分布式行为体运行时间
类型系统增强
- SE-0309:为所有协议解锁存在性
- SE-0326:启用多语句闭合参数/结果类型推理
- SE-0328:结构化的不透明结果类型
- SE-0341:不透明的参数声明
- SE-0345:
if let影射现有可选变量的速记法 - SE-0346:主要关联类型的轻量级同类型要求
- SE-0347:来自默认表达式的类型推理
- SE-0348:用于结果构建器的 buildPartialBlock
- SE-0352:隐式打开的存在物(Implicitly Opened Existentials
- SE-0353:受限的存在性类型
- SE-0358:标准库中的主要关联类型
- SE-0360:具有有限可用性的不透明结果类型
- SE-0361:关于绑定的通用类型的扩展
字符串处理
- SE-0350:Regex类型和概述
- SE-0351:Regex builder DSL
- SE-0354:Regex字元
- SE-0355:Regex语法和运行时构造
- SE-0357:以Regex为动力的字符串处理算法
指针的可用性
- SE-0333:扩展 withMemoryRebound 的可用性
- SE-0334:指针 API 可用性的改进
- SE-0349:来自原始内存的不对齐加载和存储
Swift 包管理器