跳到主要内容

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 层。

相关链接