
在最新的开发者大会 WWDC25 上,Swift 宣布Approachable Concurrency将成为 Swift 6.2 中的一个新特性,旨在简化移动应用中最常见用例的并发编程。
启用 Approachable Concurrency 将使 Swift 编译器更加具有可预测性,以减少它生成的错误和警告的数量,这些错误和警告可能会难以解决且不总是与代码的实际问题相关。
在底层,Approachable Concurrency 引入了两个新的编译器标志:推断隔离遵从性和默认执行 nonisolated(nonsending)。
第一个特性引入了隔离遵从性( isolated conformance)的概念,它将遵从性限制在与遵从类型相同的隔离域内。例如,假设我们有MyModelType
遵从Equatable
:
MyModelType
为所有Equatable
需求提供了实现,它将被绑定到MyModelType
的隔离域,例如@MainActor
。然而,遵从性声明没有指定任何隔离域,这意味着MyModelType
对编译器来说在任何隔离域上都遵从Equatable
。因此,编译器会愉快地编译对MyModelType
的Equatable
要求的任意调用,但这会在从不同的 actor 调用时产生运行时错误。对比如下的声明:
在这种情况下,遵从性被限制在与实现它的类相同的隔离域内,编译器将检测任何尝试从非主 actor 调用MyModelType
的Equatable
方法的尝试。
新的推断隔离遵从性
特性使程序员无需显式限制对Equatable
的遵从性。
第二个特性,强制 nonisolated(nonsending),它将确保nonisolated async
的异步函数默认在调用 actor 的执行器上运行,而不是在全局执行器上运行。这种新行为统一了非async
nonisolated
函数的行为。
Approachable Concurrency 是与另一个重要的并发相关特性一起引入,即默认使用主 actor。这强制实现了所有函数默认在主 actor 上运行的原则,除非程序员明确指示其他情况。
这些新特性受到了许多 Swift 开发者的欢迎,他们发现采用 Swift 6 严格的并发模型打开了一个类似潘多拉盒子的问题,导致许多人怀疑Swift 6并发是否走得太远或太快,在 Swift 论坛上引发了一个漫长但极其有趣的讨论。
虽然讨论深入且富有洞察力,但总结一下就是,Swift 可能在语言、生态系统和文档完全准备好之前,过快地将并发推向开发者。对于移动应用来说,它也走得太远了,因为移动应用往往比通用并发软件更简单。在实践中,大多数 iOS 和 iPadOS 应用主要在主线程上运行,只有少数任务被卸载到后台,以保持 UI 的响应性。
正如 Donny Wals(多本 Swift 书籍的作者,包括 Practical Swift Concurrenty)所指出的:
与 Xcode 26 创建的新项目默认在主 actor 上运行的代码搭配时,你会发现 Approachable Concurrency 确实实现了它的承诺。它消除了某些需要为不存在的问题提供奇怪修复的晦涩编译器错误。
Approachable Concurrency 和默认使用主 actor 只是Swift团队官方愿景文件中提到的几个旨在简化并发编程的新特性中的两个,这些特性将在未来 Xcode 26 测试版中逐步发布。
原文链接:
Swift 6.2 Introduces Approachable Concurrency to Simplify Concurrent Programming
评论