Swift 5.7 发布!
Swift 5.7 现已正式发布!Swift 5.7 包括对语言和标准库的主要新增功能,对编译器进行增强以获得更好的开发者体验,对 Swift 生态系统中的工具(包括 SourceKit-LSP 和 Swift Package Manager)进行改进,完善 Windows 支持等等。
Swift 5.7 是 Swift 社区成员无数贡献的结晶。感谢社区中每一个人对 Swift 论坛的讨论、错误报告、拉取请求、教育内容以及更多方面的贡献!
如果您是 Swift 新手,《Swift 编程语言》是官方 Swift 指南,并且已针对 5.7 版本进行了更新。Swift 社区维护了许多译本。它也可以在 Apple Books 商店免费获取。
语言和标准库
Swift 5.7 语言和标准库具有许多改进
- 常用样板代码的新速记语法,包括
if let语句和多语句闭包类型注解 - 解除长期存在的语言限制,使泛型编程更加无缝
- 通过新的注解和可选诊断增强数据竞争安全性
- 分布式环境中的 Actor 隔离
- 改进了一套现有指针 API 的可用性
- 全新的语言支持和用于字符串处理的 API
这些功能中的大多数在 WWDC22 上进行了讨论,并在之前的博客文章 WWDC22 的 Swift 语言公告中进行了介绍。您还可以在Swift 演进附录中找到语言和标准库 Swift 演进提案的完整列表。
开发者体验
新的泛型实现
除了上述用于处理泛型的语言改进之外,类型检查器的泛型实现已从头开始重写,提高了正确性和性能。
新的实现修复了许多长期存在的错误,主要与处理复杂的同类型需求有关,例如集合的 SubSequence 关联类型的同类型需求,以及使用定义需求 Self.Element == Self 的 CaseIterable 协议的代码。
新的泛型实现还提高了性能。在协议和关联类型的某些配置中,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 Package Manager
以下 SwiftPM 的 Swift 演进 提案已被接受,并在 Swift 5.7 中实现
- SE-0292:软件包注册表服务
- SE-0303:构建工具插件 和 SE-0332:命令插件 最初在 Swift 5.6 中引入,现已进一步完善,并通过 Xcode 提供。
- SE-0339:用于消除歧义的模块别名
分布式 Actor 库
基于 SE-0336:分布式 Actor 隔离,用于在 Swift 中构建分布式系统的 服务器库 已开源。该库提供了一个对等集群 Actor 系统实现,包括集群管理、故障检测以及与服务发现的集成。
Windows 平台
Swift 5.7 对 Windows 支持进行了以下改进
- Windows 工具链已完全采用 swift-driver 作为编译器驱动程序,C++ 驱动程序不再打包或作为后备提供。
- 安装程序在部署模块映射和打包文件方面更加稳健,从而减小了安装程序下载的大小。
- 新的更小下载中添加了 API 摘要器和其他工具。
- 通过删除不必要的路径组件,SDK 布局得到了进一步简化。
- 开发者库经过重组,以允许多架构安装,因为我们继续支持 ARM64 和 X86 目标以及 X64。
- 为 Swift 标准库以外的库实现了对静态 Swift 库的初始支持,并且可以与 Windows 上的 CMake 和 Bazel 等构建工具一起使用。
下载
官方二进制文件可从 下载,适用于 Xcode、Windows 和 Linux。Swift 5.7 编译器也包含在 Xcode 14 中。
您还可以安装适用于 Amazon Linux 2 和 CentOS 7 的 RPM,仅供实验使用。请提供您的反馈。使用以下说明进行 RPM 安装
Amazon 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 Package Manager 提案通过 Swift 演进 流程被接受,并在 Swift 5.7 中实现。
并发
- SE-0302:Sendable 和 @Sendable 闭包
- SE-0329:Clock、Instant 和 Duration
- SE-0336:分布式 Actor 隔离
- SE-0338:阐明非 Actor 隔离异步函数的执行
- SE-0340:从异步属性不可用
- SE-0343:顶层代码中的并发
- SE-0344:分布式 Actor 运行时
类型系统增强
- SE-0309:为所有协议解锁存在类型
- SE-0326:启用多语句闭包参数/结果类型推断
- SE-0328:结构化不透明结果类型
- SE-0341:不透明参数声明
- SE-0345:
if let阴影现有可选变量的简写 - SE-0346:主要关联类型的轻量级同类型需求
- SE-0347:从默认表达式进行类型推断
- SE-0348:用于结果构建器的 buildPartialBlock
- SE-0352:隐式打开的存在类型
- SE-0353:受约束的存在类型
- SE-0358:标准库中的主要关联类型
- SE-0360:具有有限可用性的不透明结果类型
- SE-0361:绑定泛型类型的扩展
字符串处理
- SE-0350:Regex 类型和概述
- SE-0351:Regex 构建器 DSL
- SE-0354:Regex 字面量
- SE-0355:Regex 语法和运行时构造
- SE-0357:Regex 驱动的字符串处理算法
- SE-0363:用于字符串处理的 Unicode
指针可用性
- SE-0333:扩展 withMemoryRebound 的可用性
- SE-0334:指针 API 可用性改进
- SE-0349:从原始内存进行未对齐的加载和存储
Swift Package Manager
- SE-0292:软件包注册表服务
- SE-0339:用于消除歧义的模块别名