swift-concurrency-pro

swift-concurrency-pro

热门

审查 Swift 并发代码的正确性、现代 API 使用情况以及常见的 async/await 陷阱。在阅读、编写或审查 Swift 并发代码时使用。

492Star
19Fork
更新于 2026/5/17
SKILL.md
readonly只读
name
swift-concurrency-pro
description

审查 Swift 并发代码的正确性、现代 API 使用情况以及常见的 async/await 陷阱。在阅读、编写或审查 Swift 并发代码时使用。

审查 Swift 并发代码的正确性、现代 API 使用情况以及是否符合项目约定。仅报告真正的问题——不要吹毛求疵或捏造问题。

审查流程:

  1. 使用 references/hotspots.md 扫描已知危险模式,确定优先检查的内容。
  2. 使用 references/new-features.md 检查最新的 Swift 6.2 并发行为。
  3. 使用 references/actors.md 验证 actor 的重入性和隔离正确性。
  4. 使用 references/structured.md 确保在适当情况下优先使用结构化并发而非非结构化并发。
  5. 使用 references/unstructured.md 检查非结构化任务使用的正确性。
  6. 使用 references/cancellation.md 验证取消处理是否正确。
  7. 使用 references/async-streams.md 验证异步流和续体的使用。
  8. 使用 references/bridging.md 检查同步与异步世界之间的桥接代码。
  9. 使用 references/interop.md 审查任何遗留并发迁移。
  10. 使用 references/bug-patterns.md 对照常见故障模式进行交叉检查。
  11. 如果项目存在严格并发错误,使用 references/diagnostics.md 将诊断映射到修复方案。
  12. 如果审查测试,使用 references/testing.md 检查异步测试模式。

如果进行部分审查,仅加载相关的参考文件。

核心指令

  • 目标为 Swift 6.2 或更高版本,并启用严格并发检查。
  • 如果代码跨越多个目标或包,在假设行为一致之前,先比较它们的并发构建设置。
  • 优先使用结构化并发(任务组)而非非结构化并发(Task {})。
  • 新代码优先使用 Swift 并发而非 Grand Central Dispatch。在底层代码、框架互操作或性能关键的同步工作中,GCD 仍然是合适的工具——不要将这些标记为错误。
  • 如果 API 同时提供 async/await 和基于闭包的变体,始终优先使用 async/await
  • 未经询问,不要引入第三方并发框架。
  • 不要建议使用 @unchecked Sendable 来修复编译器错误。它会静默诊断而不修复底层竞态。应优先使用 actor、值类型或 sending 参数。唯一合法的用途是那些具有内部锁且可证明线程安全的类型。

输出格式

按文件组织发现。对于每个问题:

  1. 指出文件和相关行号。
  2. 说明违反的规则。
  3. 展示简短的修复前后代码对比。

跳过没有问题的文件。最后以优先摘要结束,列出最需要优先进行的有影响力的更改。

示例输出:

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)
    }
}

摘要

  1. 正确性(高): 第 18 行的 actor 重入错误可能导致重复下载和强制解包崩溃。
  2. 结构(中): 第 34 行循环中的非结构化任务丢失了取消传播。

示例结束。

参考

  • references/hotspots.md - 代码审查的 grep 目标:已知危险模式及每项应检查的内容。
  • references/new-features.md - Swift 6.2 更改影响审查建议:默认 actor 隔离、隔离一致性、调用者-actor 异步行为、@concurrentTask.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 的异步测试策略、竞态检测、避免基于时间的测试。