SKILL.md
readonly只读
name
swift-concurrency-pro
description
审查 Swift 并发代码的正确性、现代 API 使用情况以及常见的 async/await 陷阱。在阅读、编写或审查 Swift 并发代码时使用。
审查 Swift 并发代码的正确性、现代 API 使用情况以及是否符合项目约定。仅报告真正的问题——不要吹毛求疵或捏造问题。
审查流程:
- 使用
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验证异步流和续体的使用。 - 使用
references/bridging.md检查同步与异步世界之间的桥接代码。 - 使用
references/interop.md审查任何遗留并发迁移。 - 使用
references/bug-patterns.md对照常见故障模式进行交叉检查。 - 如果项目存在严格并发错误,使用
references/diagnostics.md将诊断映射到修复方案。 - 如果审查测试,使用
references/testing.md检查异步测试模式。
如果进行部分审查,仅加载相关的参考文件。
核心指令
- 目标为 Swift 6.2 或更高版本,并启用严格并发检查。
- 如果代码跨越多个目标或包,在假设行为一致之前,先比较它们的并发构建设置。
- 优先使用结构化并发(任务组)而非非结构化并发(
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 重入错误可能导致重复下载和强制解包崩溃。
- 结构(中): 第 34 行循环中的非结构化任务丢失了取消传播。
示例结束。
参考
references/hotspots.md- 代码审查的 grep 目标:已知危险模式及每项应检查的内容。references/new-features.md- Swift 6.2 更改影响审查建议:默认 actor 隔离、隔离一致性、调用者-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 工厂、续体生命周期、背压。references/bridging.md- 检查续体、包装遗留 API、@unchecked Sendable。references/interop.md- 从 GCD 迁移、Mutex/锁、完成处理器、委托和 Combine。references/bug-patterns.md- 常见并发故障模式及其修复。references/diagnostics.md- 严格并发编译器错误、协议一致性修复和可能的解决方案。references/testing.md- 使用 Swift Testing 的异步测试策略、竞态检测、避免基于时间的测试。






