CleanArchitectureDemo/
├── Application/
│ └── DIContainer.swift # 依赖注入
│
├── Core/ # 共享层(所有 Feature 可用)
│ └── Network/
│ └── NetworkError.swift # 通用网络错误
│
├── Features/ # 功能模块
│ └── Users/ # 用户模块(完整独立)
│ ├── Domain/ # 业务层
│ │ ├── User.swift
│ │ ├── UserRepositoryProtocol.swift
│ │ ├── FetchUsersUseCase.swift
│ │ └── SearchUsersUseCase.swift
│ ├── Data/ # 数据层
│ │ ├── UserDTO.swift
│ │ ├── UserRepository.swift
│ │ ├── UserRemoteDataSource.swift
│ │ └── UserLocalDataSource.swift
│ └── Presentation/ # 表现层
│ ├── UsersViewModel.swift
│ ├── UsersViewController.swift
│ └── UserCell.swift
│
├── AppDelegate.swift
└── SceneDelegate.swift
┌─────────────────────────────────────────────────────────────────────────────┐
│ 用户操作 │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Presentation Layer │ │
│ │ ┌──────────────────────┐ ┌──────────────────────┐ │ │
│ │ │ UsersViewController │─────▶│ UsersViewModel │ │ │
│ │ │ │ │ │ │ │
│ │ │ • 显示 UI │◀─────│ • 处理 UI 逻辑 │ │ │
│ │ │ • 响应用户操作 │ 状态 │ • 调用 UseCase │ │ │
│ │ │ • 绑定 ViewModel │ 更新 │ • 转换数据格式 │ │ │
│ │ └──────────────────────┘ └──────────┬───────────┘ │ │
│ └───────────────────────────────────────────┼─────────────────────────┘ │
│ │ │
│ │ 调用 │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Domain Layer │ │
│ │ ┌──────────────────────┐ ┌──────────────────────┐ │ │
│ │ │ FetchUsersUseCase │ │ User │ │ │
│ │ │ │ │ (Entity) │ │ │
│ │ │ • 执行业务逻辑 │─────▶│ │ │ │
│ │ │ • 调用 Repository │ 返回 │ • id, name, email │ │ │
│ │ │ │ │ • 业务属性/方法 │ │ │
│ │ └──────────┬───────────┘ └──────────────────────┘ │ │
│ │ │ │ │
│ │ │ 依赖协议 ┌──────────────────────┐ │ │
│ │ │◀─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─│ UserRepositoryProtocol│ │ │
│ │ │ 依赖倒置 │ (接口) │ │ │
│ └─────────────┼──────────────────────────┴──────────────────────┴─────┘ │
│ │ ▲ │
│ │ 调用接口 │ 实现 │
│ ▼ │ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Data Layer │ │
│ │ ┌──────────────────────┐ │ │
│ │ │ UserRepository │──────────────────────┐ │ │
│ │ │ (实现协议) │ │ │ │
│ │ │ │ │ │ │
│ │ │ • 协调数据源 │ │ │ │
│ │ │ • 缓存策略 │ │ │ │
│ │ │ • DTO → Entity 转换 │ │ │ │
│ │ └──────────┬───────────┘ │ │ │
│ │ │ │ │ │
│ │ ▼ ▼ │ │
│ │ ┌──────────────────────┐ ┌──────────────────────┐ │ │
│ │ │ UserRemoteDataSource │ │ UserLocalDataSource │ │ │
│ │ │ │ │ │ │ │
│ │ │ • 网络请求 API │ │ • UserDefaults 缓存 │ │ │
│ │ │ • 返回 UserDTO │ │ • 返回 UserDTO │ │ │
│ │ └──────────┬───────────┘ └──────────────────────┘ │ │
│ └─────────────┼───────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ 网络 / API │ │
│ │ JSONPlaceholder│ │
│ └───────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
User Tap ──▶ ViewController ──▶ ViewModel ──▶ UseCase ──▶ Repository ──▶ DataSource ──▶ API
◀── State ───────◀── Entity ────◀── Entity ───◀── DTO ─────◀── JSON ──┘
┌─────────────────────────────────────────────────────────┐
│ │
│ 依赖方向(编译时) 数据流向(运行时) │
│ │
│ Presentation Presentation │
│ │ ▲ │
│ ▼ │ │
│ Domain ◀─ ─ ┐ Domain │
│ │ │ ▲ │
│ ▼ │ │ │
│ Data ─ ─ ─ ─ ─┘ Data │
│ ▲ │
│ (外层依赖内层) │ │
│ (内层不知道外层) External API │
│ │
└─────────────────────────────────────────────────────────┘
| 层 | 职责 | 包含内容 |
|---|---|---|
| Presentation | UI 展示和用户交互 | ViewController, ViewModel, View |
| Domain | 核心业务逻辑 | Entity, UseCase, Repository Protocol |
| Data | 数据获取和存储 | Repository 实现, DataSource, DTO |
| Core | 跨模块共享代码 | 网络错误、工具类、扩展 |
- 依赖倒置: Domain 层定义 Protocol,Data 层实现
- 单一职责: 每个 UseCase 只做一件事
- 关注点分离: Entity/DTO/ViewData 各司其职
- Feature-based 组织: 按功能模块而非层级组织代码