为什么升级到 Swift 6
Swift 6 引入了严格的并发安全检查,这意味着编译器会在编译时发现潜在的数据竞争问题。对于 WidgetCraft 这样一个涉及大量异步操作的应用来说,这是一个不容忽视的升级。
迁移过程中的主要挑战
Sendable 协议
最大的变化之一是 Sendable 协议的强制执行。我们的大量 Model 类型需要被标记为 Sendable,这意味着:
- 所有存储属性必须是
Sendable的 - 类类型需要用
@unchecked Sendable或改为值类型 - 闭包捕获需要额外注意
Actor 隔离
我们将几个核心管理器重构为 Actor:
WidgetStore→actor WidgetStoreThemeManager→@MainActor class ThemeManager
这种变化虽然增加了一些语法负担,但完全消除了数据竞争的可能性。
渐进式迁移策略
我们没有选择一次性迁移所有代码,而是采用了渐进式策略:
- 先在模块级别启用严格并发检查
- 从底层工具库开始修复
- 逐步向上层业务代码推进
- 最后处理 UI 层
经验总结
- 值类型优先:尽量使用 struct 而非 class
- 明确线程边界:用
@MainActor标注所有 UI 相关代码 - 善用
nonisolated:对于不涉及状态的方法,显式标注 - 测试不能少:并发 Bug 往往在高负载下才会出现
结语
升级到 Swift 6 的过程虽然痛苦,但收益是巨大的。我们的应用稳定性提升了一个档次,代码可维护性也更好了。强烈建议还在观望的团队尽早开始迁移。