☰
swift-concurrency-expert - SKILL
2026/10/12 4:36:56 网站建设 项目流程

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 特定的并发指导。

局限性

  • 仅当任务明确符合上述范围时使用此技能。
  • 不要将输出视为特定环境验证、测试或专家审查的替代品。
  • 如果缺少必要的输入、权限、安全边界或成功标准,请停下来询问澄清。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询