[ PROMPT_NODE_25528 ]
approachable-concurrency
[ SKILL_DOCUMENTATION ]
## 易用并发 (Swift 6.2) - 项目模式快速指南
当项目选择了 Swift 6.2 易用并发设置(默认 Actor 隔离 / 默认主 Actor)时,请使用此参考。
## 检测模式
检查 Xcode 构建设置中的 "Swift Compiler - Concurrency":
- Swift 语言版本 (必须为 6.2+)。
- 默认 Actor 隔离 / 默认主 Actor。
- 严格并发检查级别 (Complete/Targeted/Minimal)。
对于 SwiftPM,检查 Package.swift 中的 swiftSettings 以获取相同的标志。
## 预期的行为变化
- 异步函数默认保留在调用者的 Actor 上;除非实现选择这样做,否则它们不会跳转到全局并发执行器。
- 默认主 Actor 减少了 UI 绑定代码和全局状态的数据竞争错误,因为可变状态被隐式保护。
- 协议一致性可以是隔离的 (例如 `extension Foo: @MainActor Bar`)。
## 如何在此模式下应用修复
- 优先使用最小注解;当代码是 UI 绑定时,让默认主 Actor 发挥作用。
- 使用隔离的一致性,而不是强制使用 `nonisolated` 变通方法。
- 除非有明确的性能需求需要卸载,否则将全局或共享可变状态保持在主 Actor 上。
## 何时选择退出或卸载工作
- 在必须在并发池上运行的异步函数上使用 `@concurrent`。
- 仅当类型或成员真正线程安全且在主 Actor 之外使用时,才将其设为 `nonisolated`。
- 当值跨越 Actor 或任务时,继续遵守 Sendable 边界。
## 常见陷阱
- `Task.detached` 会忽略继承的 Actor 上下文;除非确实需要打破隔离,否则请避免使用它。
- 如果 CPU 密集型工作保留在主 Actor 上,默认主 Actor 可能会掩盖性能问题;将这些工作移至 `@concurrent` 异步函数中。
## 关键字 (来自源速查表)
| 关键字 | 作用 |
| --- | --- |
| `async` | 函数可以暂停 |
| `await` | 在此暂停直到完成 |
| `Task { }` | 启动异步工作,继承上下文 |
| `Task.detached { }` | 启动异步工作,不继承上下文 |
| `@MainActor` | 在主线程上运行 |
| `actor` | 具有隔离可变状态的类型 |
| `nonisolated` | 选择退出 Actor 隔离 |
| `Sendable` | 在隔离域之间传递是安全的 |
| `@concurrent` | 始终在后台运行 (Swift 6.2+) |
| `async let` | 启动并行工作 |
| `TaskGroup` | 动态并行工作 |
## 来源
https://fuckingapproachableswiftconcurrency.com/en/