Airbnb 采用 SwiftUI 的背景与动机
2022 年,Airbnb 的 iOS 团队认为 SwiftUI 已经足够成熟,可以用于官方应用的开发。团队希望通过 SwiftUI 的灵活性、组合性、声明式语法、简洁性和符合语言习惯的特性,提升开发者体验,同时不影响用户体验。
过渡计划的三阶段
为了确保过渡顺利进行,Airbnb 制定了一个三阶段计划:
- 第一阶段:基于现有设计系统,构建一系列可重用的 SwiftUI 组件。
- 第二阶段:使用基础组件构建完整的屏幕。
- 第三阶段:将多个屏幕组合成完整的功能模块。
在正式开始前,团队还进行了一个小规模的试点,邀请工程师自愿尝试 SwiftUI,以收集反馈并提前改进基础设施。
关键步骤与技术支持
- 重建设计系统:
团队使用 SwiftUI 重建了现有的设计系统,基于一系列样式协议,通过视图修饰符将这些样式实例化并传递给视图。这使得开发者能够用少量代码轻松自定义 UI 组件。 - 双向桥接 UIKit 与 SwiftUI:
团队构建了一个基础设施,支持 UIKit 的 Epoxy 视图与 SwiftUI 视图之间的双向桥接。具体实现包括使用UIHostingViewController将 SwiftUI 层次结构嵌入视图控制器,以及使用UIViewRepresentable将 UIKit 视图集成到 SwiftUI 层次结构中。 - 状态管理与数据流:
团队将 Epoxy 的单向数据流适配到 SwiftUI 中,采用ObservableObject作为状态类的核心,以在每次状态变化时触发 SwiftUI 的重新渲染。这种方式使得业务逻辑和状态变更逻辑能够与展示逻辑分离,深受工程师欢迎。 - 测试能力提升:
为了确保新实现的 SwiftUI 组件与现有的快照测试方法兼容,团队为每个视图变体分配了名称,并使其符合 Xcode 的PreviewProvider协议,以便使用 Xcode Previews。此外,团队还集成了ViewInspector,支持行为式测试,能够在运行时遍历视图层次结构并直接访问底层的View结构,从而检查内部状态并模拟用户交互。
成果与性能表现
通过采用 SwiftUI,Airbnb 工程师成功将代码量减少到 UIKit 实现的大约六分之一,且未因 SwiftUI 的响应式特性而出现显著的性能损失,仅在实例化 UIHostingController 时存在少量开销。
总结
Airbnb 的 SwiftUI 采用过程展示了如何通过精心规划和基础设施支持,成功将新技术引入大型项目,同时提升开发效率和代码质量。更多详细信息和代码片段可参考原文。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。