Airbnb 的三阶段 SwiftUI 迁移实践
从 2022 年开始,Airbnb 的 iOS 团队就认为 SwiftUI 已经足够成熟,可以在他们的官方应用中使用它。但 Airbnb 的工程师 Bryn Bodayle 表示,这需要一个谨慎的转换过程。
Airbnb 的工程师认为,SwiftUI 的主要优势是它的灵活性和可组合性、声明性、简洁性和惯用性,他们希望这些优势可以改进开发者体验,同时不会在用户体验方面有所损失。
为了尽可能实现无缝的过渡,他们制定了一个三阶段计划。在第一阶段,他们基于现有的设计系统构建一系列可重用的组件。在第二阶段,他们对基本组件进行组合,构建出整个屏幕。在第三个也是最后一个阶段,屏幕将被组合成完整的功能。
在开始前两个阶段之前,Airbnb 的一群自愿者工程师先进行小型试点,并收集反馈,尽早改进他们的基础设施。
如上所述,第一步是基于一系列风格使用 SwiftUI 重建现有的设计系统,这些风格可以通过修饰符实例化并传给视图。这为开发人员使用几行代码轻松定制 UI 组件提供了基础。
第二步是构建基础设施,实现基于 UIKit 的 Epoxy 视图和 SwiftUI 视图之间的双向桥接。桥接的实现细节可以在原文中找到。简单地说,桥接是基于 UIHostingViewController(将 SwiftUI 层次结构嵌入到视图控制器)和 UIViewRepresentable(将 UIKit 视图集成到 SwiftUI 层次结构)。
Airbnb 工程师做出的另一个决定是将 Epoxy 的单向数据流应用到 SwiftUI,将 ObservableOject 作为状态类的基础,在每次状态变化时触发 SwiftUI 重新渲染。
我们发现,工程师们更喜欢继续使用这种方法来构建屏幕,因为这样可以让业务和状态修改逻辑与表示逻辑分开。
可测试性在 Airbnb 有比较高的优先级。他们的新 SwiftUI 实现需要能够很好地适应他们的快照测试方法。为此,他们为每个定义的视图变体起了一个名字,以便与他们的快照测试服务一起使用,并让所有视图变体遵循 Xcode 的 PreviewProvider 协议,以便使用 Xcode 预览。此外,为了支持行为风格测试,他们集成了 ViewInspector。ViewInspector 允许在运行时遍历视图层次结构,并可直接访问底层“视图”结构体,从而使内部状态变得可检查,并可以编程的方式模拟用户交互。
Bodayle 解释说,与 UIKit 实现相比,现在的代码量大约减少到原来的六分之一,而且没有出现与 SwiftUI 响应性相关的性能损失,除了实例化 UIHostingController 时的一点开销。
关于 Airbnb 采用 SwiftUI,这里无法全部概述,所以请不要错过原文的内容和一些有用的代码片段。
原文链接:
https://www.infoq.com/news/2023/10/airbnb-transitioning-swiftui/
声明:本文为 InfoQ 翻译,未经许可禁止转载。
微信扫码关注该文公众号作者