Swift 6 适配的一些体会以及对现状的小吐槽
💡
原文中文,约8100字,阅读约需20分钟。
📝
内容提要
最近进行了两三个项目的Swift 6迁移,虽然过程不顺利,但最终有所收获。Swift 6的卖点是并发编程和编译时线程安全。通过引入actor隔离和Sendable标注,Swift 6可以在编译阶段排除数据竞争和线程问题。
🎯
关键要点
- 最近对两三个项目进行了 Swift 6 的迁移,过程不顺利但有所收获。
- Swift 6 的卖点是并发编程和编译时线程安全,通过 actor 隔离和 Sendable 标注来排除数据竞争和线程问题。
- 迁移时,官方的 Migrating to Swift 6 文档是最佳阅读材料,需确认 Common Compiler Errors 和 Incremental Adoption 的内容。
- Swift 6 的迁移并不算乐事,许多项目没有迫切需要迁移,官方框架和类型缺乏 Sendable 标记。
- 建议编写新代码时引入新的 target,并按照 Swift 6 的写法进行,以减少未来迁移的工作量。
- 迁移过程中会遇到大量错误,主要任务包括添加 @MainActor、标记 Sendable 和将回调函数改写成 async。
- 对于 @MainActor 的使用,需确保主线程安全,可能需要在代码中添加 @MainActor 标记以确保隔离。
- Sendable 类型的标记对于只含有值类型变量的 struct 或 enum 是无痛的,但对于含有 var 变量的 class 需要实现线程安全机制。
- 尽量避免 Sendable 的回调,建议用 async 重写带回调的方法,以减少不必要的 Sendable 类型适配。
- deinit 的隔离问题在 Swift 6 中无法解决,可能需要使用 Task 来捕获需要隔离的值。
- Swift 语言的复杂度增加,给新手带来困难,开发者面临更重的学习负担。
- Swift 现今的发展似乎没有把重点放在帮助开发者更好更快地完成 app 上,未来的发展值得关注。
❓
延伸问答
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,这对初学者来说非常困难。
➡️