mcpField
M
modern-swift

modern-swift

github.com/johnrogers开发233180 次安装40 周前更新
代码仓库

关于 modern-swift

面向采用 Swift 6.2 和严格编译期检查的开发者的现代 Swift 并发指南,介绍 async/await、actor、任务组、取消处理及旧模式迁移。

主要功能

  1. 01async/await 并发模式
  2. 02使用 actor 管理共享可变状态
  3. 03任务组与取消处理
  4. 04严格并发与 Sendable 指引
  5. 05从旧式并发模式迁移

适用场景

  1. 01将完成回调替换为 async/await
  2. 02在不使用锁的情况下管理共享状态
  3. 03运行并行异步操作
  4. 04启用严格并发并处理 Sendable 错误

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/johnrogers/claude-swift-engineering --skill modern-swift

安装后在 Claude Code 中输入/modern-swift确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
concurrency-essentials.md
macros.md
migration-patterns.md
modern-attributes.md
strict-concurrency.md
swift6-concurrency.md
task-cancellation.md
task-groups.md

详细介绍

Modern Swift(6.2+)

Swift 6.2 引入了严格的编译时并发检查,通过 async/await、actor 和 Sendable 约束在编译时而非运行时防止数据竞争。这是实现安全并发 Swift 的基础。

概览

Modern Swift 以编译器强制的安全机制取代了旧式并发模式(完成处理器、DispatchQueue、锁)。核心原则:启用严格并发检查后,只要代码能够编译,就不会发生数据竞争。

快速参考

需求使用不要使用
异步操作async/await完成处理器
主线程工作@MainActorDispatchQueue.main
共享可变状态actor锁、串行队列
并行任务TaskGroupDispatchGroup
线程安全Sendable到处使用 @unchecked

核心工作流

编写 Swift 异步代码时:

  1. 用 async 标记异步函数,并用 await 调用
  2. 对视图模型和更新 UI 的代码使用 @MainActor
  3. 使用 actor 而非锁来管理共享可变状态
  4. 在循环中检查 Task.isCancelled 或调用 Task.checkCancellation()
  5. 在 Package.swift 中启用严格并发检查,以确保编译时安全

参考资料加载指南

只要有哪怕一点可能需要用到相关内容,就务必加载参考文件。 与其遗漏某种模式或犯错,不如先获取相关上下文。

参考资料加载时机
并发基础编写异步代码、转换完成处理器或使用 await 时
Swift 6 并发使用 @concurrent、nonisolated(unsafe) 或 actor 模式时
任务组并行运行多个异步操作时
任务取消实现长时间运行或可取消的操作时
严格并发检查启用 Swift 6 严格模式或修复 Sendable 错误时
宏使用或了解 @Observable 等 Swift 宏时
现代属性迁移旧代码或使用 @preconcurrency、@backDeployed 时
迁移模式改造代理模式或 UIKit 视图时

常见错误

  1. 把 @unchecked Sendable 当作快速修复方案 — 使用 @unchecked Sendable 消除编译器错误,意味着你放弃了安全保证。如果使用 @unchecked 后错误仍然存在,说明代码可能存在数据竞争。应修复根本问题。

  2. 调用处漏写 await — 调用异步函数时忘记写 await 会导致编译错误;但在循环中检查 Task.isCancelled 却不调用 Task.checkCancellation(),则会悄然忽略取消信号。

  3. 在异步代码块中未使用 weak 捕获 self — 在长时间运行的异步任务中持有对 self 的强引用,会阻止 deinit。始终在闭包中使用 [weak self],或使用 .task 自动管理生命周期。

  4. 未检查任务取消状态 — 长时间运行的操作应定期检查 Task.isCancelled 或调用 Task.checkCancellation(),否则会忽略取消信号。

  5. UI 代码和测试套件忘记添加 @MainActor — 更新 @Published 属性的主测试结构体和视图模型需要使用 @MainActor。忘记添加会悄然允许跨线程修改。以下内容应使用 @MainActor:视图模型、视图结构体、主测试结构体,以及任何访问 UI 的类型。

  6. 意外的 Actor 重入行为 — 在 actor 方法中使用 await 可能会暂时释放锁。其他任务可能会修改 actor 状态。设计 actor 方法时,应假设状态在不同的 await 之间可能发生变化。

评论

支持 Markdown