Swift 6 适配的一些体会以及对现状的小吐槽
内容提要
最近进行了两三个项目的Swift 6迁移,虽然过程不顺利,但最终有所收获。Swift 6的卖点是并发编程和编译时线程安全。通过引入actor隔离和Sendable标注,Swift 6可以在编译阶段排除数据竞争和线程问题。
延伸解读
迁移时机:为何建议再等一两年
作者基于两三个项目的迁移经验指出,Swift 6 迁移并不轻松,且官方与社区都未完全准备好,大量框架缺乏 Sendable 标记。由于 Apple 明确 Swift 6 是可选项,编译器仍兼容 Swift 4 及以上,大多数项目没有迫切迁移需求。因此,若还在犹豫,可以再等一两年,避免过早投入高成本却收益有限。
新代码策略:用新 target 隔离技术债
如果不做任何改变,现有代码在未来迁移时会变成技术债。作者建议编写新代码时引入新的 target,并直接按照 Swift 6 和严格并发模型书写。这样未来迁移时,新代码无需重复适配,能有效减少整体工作量。这是一种平衡当下开发效率与未来迁移成本的务实做法。
迁移核心任务与常见陷阱
迁移时主要任务包括添加 @MainActor、标记 Sendable、将回调改写成 async。@MainActor 会“传染”,底层模块标记后可能迫使依赖方立即适配,可用弃用旧方法加新方法过渡。Sendable class 需内部实现线程安全,如用锁或队列,但 @unchecked Sendable 会失去编译器检查。deinit 隔离问题目前无完美解,需关注后续 Swift 版本。
语言复杂度与开发者体验的权衡
作者认为 Swift 已变得非常复杂,新特性如宏、Property Wrapper、并发编程等对编写 app 帮助有限,却增加了学习负担和编译时间。强制数据竞争安全可能打断开发心流,而 Xcode 补全、预览等体验问题依旧。Swift 的发展似乎未将“帮助开发者更好更快完成 app”作为绝对重点,这值得社区和官方反思。
Q&A
Swift 6 的主要卖点是什么?
Swift 6 的主要卖点是并发编程和编译时线程安全,通过引入 actor 隔离和 Sendable 标注来排除数据竞争和线程问题。
迁移到 Swift 6 时遇到的主要挑战是什么?
迁移到 Swift 6 时,主要挑战包括添加 @MainActor、标记 Sendable 和将回调函数改写成 async,且会遇到大量编译错误。
在迁移过程中,哪些文档是最有帮助的?
在迁移过程中,官方的 Migrating to Swift 6 文档是最有帮助的,特别是 Common Compiler Errors 和 Incremental Adoption 的内容。
如何处理含有 var 变量的类以适应 Sendable?
对于含有 var 变量的类,需要实现线程安全机制,最简单的方法是加锁,或者使用 OSAllocatedUnfairLock 来替代 var 变量。
为什么建议用 async 重写带回调的方法?
建议用 async 重写带回调的方法,以减少不必要的 Sendable 类型适配,避免闭包的 @Sendable 标记在项目中“传染”。
Swift 6 对新手开发者的影响是什么?
Swift 6 的复杂性增加了新手开发者的学习负担,他们需要掌握更多的概念,如 actor 和 Sendable,这对初学者来说非常困难。