[ PROMPT_NODE_25526 ]
swift-concurrency-expert
[ SKILL_DOCUMENTATION ]
# Swift 并发专家
## 概述
通过应用 Actor 隔离、Sendable 安全性和现代并发模式,在 Swift 6.2+ 代码库中审查并修复 Swift 并发问题,同时保持最小的行为变更。
## 何时使用
- 当用户要求审查 Swift 并发使用情况或修复编译器诊断信息时。
- 当您需要关于 Actor 隔离、`Sendable`、`@MainActor` 或异步迁移的指导时。
## 工作流
### 1. 分类问题
- 捕获确切的编译器诊断信息和违规符号。
- 检查项目并发设置:Swift 语言版本 (6.2+)、严格并发级别,以及是否启用了易用并发 (默认 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`**
swift
// 之前:数据竞争警告,因为 ViewModel 是从主线程访问的
// 但没有 Actor 隔离
class ViewModel: ObservableObject {
@Published var title: String = ""
func load() { title = "Loaded" }
}
// 之后:注解整个类型,以便所有存储的状态和方法
// 自动隔离到主 Actor
@MainActor
class ViewModel: ObservableObject {