name: swift-concurrency-expert
description: Review and fix Swift concurrency issues such as actor isolation and Sendable violations.
risk: safe
source: “Dimillian/Skills (MIT)”
date_added: “2026-03-25”
Swift 并发专家
概述
通过应用 actor 隔离、Sendable 安全性和现代并发模式,在保持最小行为变更的前提下,审查并修复 Swift 6.2+ 代码库中的 Swift 并发问题。
何时使用
- 用户要求审查 Swift 并发用法或修复编译器诊断时。
- 你需要 actor 隔离、
Sendable、@MainActor或 async 迁移的指导时。
工作流
1. 对问题进行分诊
- 记录确切的编译器诊断和出错的符号。
- 检查项目的并发设置:Swift 语言版本(6.2+)、严格并发级别,以及是否启用了 approachable concurrency(默认 actor 隔离 / 主 actor 默认)。
- 识别当前的 actor 上下文(
@MainActor、actor、nonisolated),以及是否启用了默认 actor 隔离模式。 - 确认代码是 UI 绑定,还是打算在主 actor 之外运行。
2. 应用最小安全修复
优先选择既能保留现有行为又能满足数据竞争安全的修改。
常见修复:
- UI 绑定类型:用
@MainActor标注类型或相关成员。 - 主 actor 类型上的协议遵循:让遵循关系隔离(例如
extension Foo: @MainActor SomeProtocol)。 - 全局/静态状态:用
@MainActor保护或移入 actor。 - 后台工作:将昂贵的工作移入
nonisolated类型上的@concurrent异步函数,或使用actor保护可变状态。 - Sendable 错误:优先使用不可变/值类型;只在正确时才添加
Sendable遵循;除非你能证明线程安全,否则避免@unchecked Sendable。
3. 验证修复
- 重新构建并确认所有并发诊断都已解决,且没有引入新警告。
- 运行测试套件检查回归——并发变更即使构建干净也可能引入微妙的运行时问题。
- 如果修复暴露了新警告,将每个警告视为一次新的分诊(返回第 1 步),迭代解决,直到构建干净且测试通过。
示例
UI 绑定类型——添加@MainActor
// 之前:ViewModel 在主线程被访问但没有 actor 隔离,产生数据竞争警告classViewModel:ObservableObject{@Publishedvartitle:String=""funcload(){title="Loaded"}}// 之后:标注整个类型,使所有存储状态和方法自动隔离到主 actor@MainActorclassViewModel:ObservableObject{@Publishedvartitle:String=""funcload(){title="Loaded"}}协议遵循隔离
// 之前:编译器错误——SomeProtocol 方法是非隔离的,但遵循类型是 @MainActor@MainActorclassFoo:SomeProtocol{funcprotocolMethod(){/* 访问主 actor 状态 */}}// 之后:将遵循范围限定为 @MainActor,使要求能在正确的隔离上下文中得到满足@MainActorextensionFoo:SomeProtocol{funcprotocolMethod(){/* 安全访问主 actor 状态 */}}使用@concurrent做后台工作
// 之前:昂贵计算阻塞主 actor@MainActorfuncprocessData(_input:[Int])->[Int]{input.map{heavyTransform($0)}// 在主线程运行}// 之后:为繁重工作跳出主 actor,然后返回结果// 调用方 await 结果并停留在自己的 actor 上nonisolatedfuncprocessData(_input:[Int])async->[Int]{awaitTask.detached(priority:.userInitiated){input.map{heavyTransform($0)}}.value}// 或使用 @concurrent 异步函数(Swift 6.2+):@concurrentfuncprocessData(_input:[Int])async->[Int]{input.map{heavyTransform($0)}}参考资料
- 查看
references/swift-6-2-concurrency.md了解 Swift 6.2 的变更、模式和示例。 - 当项目选择使用 approachable concurrency 模式时,查看
references/approachable-concurrency.md。 - 查看
references/swiftui-concurrency-tour-wwdc.md了解 SwiftUI 特定的并发指导。
局限性
- 仅当任务明确符合上述范围时使用此技能。
- 不要将输出视为特定环境验证、测试或专家审查的替代品。
- 如果缺少必要的输入、权限、安全边界或成功标准,请停下来询问澄清。