swift-concurrency-pro 是一个针对 Swift 并发代码的审查技能,来源于 199-biotechnologies/swiftui-claude-skills 技能集。其定位是在阅读、编写或审查 Swift 并发代码时,检查代码的正确性、现代 API 用法,以及常见的 async/await 陷阱,并检查是否符合项目约定。审查原则是只报告真实存在的问题,不吹毛求疵、不虚构问题。
审查流程 该技能提供了一套按顺序展开的审查流程,并配有对应的参考文件:
- 使用 references/hotspots.md 扫描已知危险模式,以确定优先检查的内容。
- 使用 references/new-features.md 检查是否有受 Swift 6.2 并发行为变化影响的地方。
- 使用 references/actors.md 验证 actor 用法,检查重入性与隔离正确性。
- 使用 references/structured.md 确保在适当场景优先使用结构化并发而非非结构化并发。
- 使用 references/unstructured.md 检查非结构化任务用法是否正确。
- 使用 references/cancellation.md 验证取消处理是否正确。
- 使用 references/async-streams.md 验证 async stream 与 continuation 的用法。
- 使用 references/bridging.md 检查同步与异步世界之间的桥接代码。
- 使用 references/interop.md 审查任何遗留并发迁移。
- 使用 references/bug-patterns.md 交叉核对常见失败模式。
- 若项目存在严格并发(strict-concurrency)错误,使用 references/diagnostics.md 将诊断映射到修复方案。
- 若审查测试,使用 references/testing.md 检查异步测试模式。
- 若只做部分审查,只加载相关的参考文件。
核心指令
- 以 Swift 6.2 或更高版本、严格并发检查为目标。
- 若代码跨多个 target 或 package,在假定行为应一致之前,先比较它们的并发构建设置。
- 优先使用结构化并发(任务组)而非非结构化并发(Task {})。
- 新代码优先使用 Swift 并发而非 Grand Central Dispatch。在底层代码、框架互操作,或队列与锁才是正确工具的、性能关键的同步工作中,GCD 仍然可接受,不要将这些标记为错误。
- 若某个 API 同时提供 async/await 与基于闭包的变体,始终优先 async/await。
- 未经询问,不要引入第三方并发框架。
- 不要建议用 @unchecked Sendable 修复编译器错误。它会静默诊断而不修复底层竞态。应优先使用 actor、值类型或 sending 参数。唯一合法用途是用于内部有锁且可证明线程安全的类型。
输出格式 审查结果按文件组织。对每个问题:
- 指出文件与相关行号。
- 指明被违反的规则。
- 展示简短的前后对比代码修复。
- 跳过没有问题的文件。
- 最后给出按优先级排序的总结,说明最应先做的高影响改动。
示例输出 DataLoader.swift 第 18 行:Actor 重入——状态可能在 await 期间发生变化。 修复前: actor Cache { var items: [String: Data] = [:]
func fetch(_ key: String) async throws -> Data {
if items[key] == nil {
items[key] = try await download(key)
}
return items[key]!
}
} 修复后: actor Cache { var items: [String: Data] = [:]
func fetch(_ key: String) async throws -> Data {
if let existing = items[key] { return existing }
let data = try await download(key)
items[key] = data
return data
}
} 第 34 行:应使用 withTaskGroup,而不是在循环中创建任务。 修复前: for url in urls { Task { try await fetch(url) } } 修复后: try await withThrowingTaskGroup(of: Data.self) { group in for url in urls { group.addTask { try await fetch(url) } }
for try await result in group {
process(result)
}
} 总结:
- 正确性(高):第 18 行的 actor 重入 bug 可能导致重复下载与强制解包崩溃。
- 结构(中):第 34 行循环中的非结构化任务会丢失取消传播。
参考文件
- references/hotspots.md:代码审查的 Grep 目标,列出已知危险模式及各自需要检查的内容。
- references/new-features.md:改变审查建议的 Swift 6.2 变更,包括默认 actor 隔离、隔离 conformance、调用方 actor 的异步行为、@concurrent、Task.immediate、任务命名与优先级提升。
- references/actors.md:Actor 重入、共享状态标注、全局 actor 推断与隔离模式。
- references/structured.md:任务组优先于循环、丢弃型任务组、并发上限。
- references/unstructured.md:Task 与 Task.detached 的区别,以及何时 Task {} 属于代码异味。
- references/cancellation.md:取消传播、协作式检查、错误的取消模式。
- references/async-streams.md:AsyncStream 工厂、continuation 生命周期、背压。
- references/bridging.md:checked continuation、包装遗留 API、@unchecked Sendable。
- references/interop.md:从 GCD、Mutex/锁、完成处理器、委托与 Combine 迁移。
- references/bug-patterns.md:常见并发失败模式及其修复。
- references/diagnostics.md:严格并发编译器错误、协议 conformance 修复及可能的补救措施。
- references/testing.md:使用 Swift Testing 的异步测试策略、竞态检测、避免基于时序的测试。
限制与说明 该技能面向 Swift 并发代码审查,以 Swift 6.2+ 为基准,其具体运行方式、安装命令、收费模式与平台支持在所提供的资料中暂未提供。