Clean Architecture 与 VIPER
问题
Clean Architecture 在 iOS 中怎么落地?VIPER 是什么?
答案
Clean Architecture 分层
核心原则:依赖方向
外层依赖内层,内层不知道外层的存在。Domain 层不引用任何 UIKit、网络库。
代码结构
// Domain 层 —— 纯 Swift,不依赖任何框架
protocol UserRepository {
func fetchUsers() async throws -> [User]
}
struct FetchUsersUseCase {
let repository: UserRepository
func execute() async throws -> [User] {
try await repository.fetchUsers()
}
}
// Data 层 —— 实现 Repository
class UserRepositoryImpl: UserRepository {
private let api: APIClient
func fetchUsers() async throws -> [User] {
try await api.request(UserAPI.list)
}
}
// Presentation 层
class UserListViewModel: ObservableObject {
private let fetchUsers: FetchUsersUseCase
@Published var users: [User] = []
func load() async {
users = (try? await fetchUsers.execute()) ?? []
}
}
VIPER
| 角色 | 职责 |
|---|---|
| View | 显示 UI,接收用户事件 |
| Interactor | 业务逻辑(类似 Use Case) |
| Presenter | 连接 View 和 Interactor |
| Entity | 数据模型 |
| Router | 页面导航 |
警告
VIPER 模板代码多,适合大型团队。小项目建议使用 MVVM + Coordinator 即可。
常见面试问题
Q1: Clean Architecture 有什么好处?
答案:
- 可测试:Domain 层纯逻辑,不依赖框架,单元测试极为方便
- 可替换:切换网络库/数据库只需修改 Data 层
- 关注点分离:每层职责清晰
Q2: UseCase 是不是过度设计?
答案:如果 UseCase 只是代理调用 Repository,确实显得多余。UseCase 的价值在于组合多个 Repository、包含业务规则(如缓存策略、数据校验)。简单 CRUD 可以跳过 UseCase 层。