项目简介
clean-architecture-swiftui 是一个展示如何在 SwiftUI 应用中实现清晰架构的示例项目。本项目使用了 SwiftUI 和 Combine 框架,通过调用 restcountries.com 的 REST API 来显示国家列表及其详细信息。这个项目不仅适合初学者学习使用 SwiftUI 和架构模式,也为构建大规模的生产应用提供了模板。
主要功能
- 原生 SwiftUI + Combine 实现:项目完全基于 SwiftUI 和 Combine 构建,简化了代码设计。
- 解耦展示、业务逻辑和数据访问层:每一层各司其职,避免相互依赖。
- 全面的测试覆盖,包括 UI 测试:使用 ViewInspector 进行完整的用户界面测试。
- 类似 Redux 的中心化
AppState
:作为应用状态的唯一真相来源。 - 使用 CoreData 的数据持久化。
- 本地 SwiftUI 依赖注入。
- 程序化导航:支持深度链接的推送通知。
- 基于泛型的简易但灵活的网络层。
- 系统事件处理:如
didBecomeActive
、willResignActive
。 - 符合 SOLID、DRY、KISS、YAGNI 原则。
- 设计具有可扩展性:可作为构建大型生产应用的参考。
架构概览
展示层
展示层由 SwiftUI 视图组成,专注于状态呈现而无业务逻辑。用户操作(如点击按钮)或视图生命周期事件(如 onAppear
)会触发副作用,并将请求发送至 Interactors
。所有的状态和业务逻辑层(AppState
+ Interactors
)通过 @Environment
本地注入到视图层次结构中。
业务逻辑层
业务逻辑层由 Interactors
表示。Interactors 接收任务请求,例如从外部来源获取数据或进行计算,但从不直接返回数据。相反,它们将结果转发给 AppState
或 Binding
。当数据仅用于一个本地视图且不属于 AppState
时,Binding 是很好的选择。之前版本没有持久层,所有加载的数据都存储在 AppState
。引入持久层后,可以选择将数据库内容加载到 AppState
,或通过 Binding
按需从 Interactors
提供数据。
数据访问层
数据访问层由 Repositories
表示。Repositories 提供异步 API(通过 Combine 的 Publisher
)在后端或本地数据库中进行 CRUD 操作。它们不包含业务逻辑,也不修改 AppState
。Repositories 仅可被 Interactors 访问和使用。
整个项目展示了如何在 iOS 生态系统中利用清晰架构模式,通过分离关注点提升代码的可维护性和可扩展性,是构建高质量应用的优秀示例。