关于 swift-concurrency-pro
swift-concurrency-pro 是用于审查 Swift 并发代码的 Agent 技能,面向代码审查和并发迁移工作。它依据一组主题参考资料检查正确性、现代 API 用法和项目约定,并要求仅报告真实问题。
主要功能
- 01检查 Actor 隔离与重入
- 02评估结构化并发及任务用法
- 03检查取消与异步流处理
- 04审查同步与异步桥接
- 05对照严格并发诊断与测试
适用场景
- 01审查 Swift 并发代码变更
- 02迁移旧有并发实现
- 03排查严格并发编译错误
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ twostraws/ swift-concurrency-agent-skill --skill swift-concurrency-pro安装后在 Claude Code 中输入/swift-concurrency-pro确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.claude-plugin/plugin.jsonagents/openai.yamlassets/swift-concurrency-pro-icon.svgreferences/actors.mdasync-streams.mdbridging.mdbug-patterns.mdcancellation.mddiagnostics.mdhotspots.mdinterop.mdnew-features.mdstructured.mdtesting.mdunstructured.md详细介绍
审查 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验证异步流和 continuation 的用法。 - 使用
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 期间,状态可能已发生变化。
// Before
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]!
}
}
// After
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,而不是在循环中创建任务。
// Before
for url in urls {
Task { try await fetch(url) }
}
// After
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 工厂、continuation 生命周期、背压。references/bridging.md- Checked continuation、封装旧版 API、@unchecked Sendable。references/interop.md- 从 GCD 迁移、Mutex/锁、完成处理程序、代理和 Combine。references/bug-patterns.md- 常见并发故障模式及其修复方法。references/diagnostics.md- 严格并发编译器错误、协议一致性修复和可能的解决方法。references/testing.md- 使用 Swift Testing 的异步测试策略、竞态检测、避免基于计时的测试。
评论
支持 Markdown