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 上,未来的发展值得关注。
➡️