0Pricing
Swift Academy · 课时

分层:领域、数据与表示层

在 Swift 应用中将业务逻辑与数据访问、用户界面分离。

分层:领域、数据与表示层 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

Swift 中的清晰架构

清晰架构将代码分为多个层次:领域层(业务逻辑)、数据层(持久化和网络)以及表现层(用户界面)。

// Domain: pure Swift, no framework imports
// Data: Core Data / URLSession / JSON
// Presentation: SwiftUI / UIKit

领域层

领域层包含业务实体、用例和仓储协议。它不依赖 UIKit、SwiftUI 或数据库。

// Domain/Entities/User.swift
struct User {
  let id: Int
  var name: String
  var email: String
}
// No import UIKit, no import SwiftData

领域中的用例

一个用例封装一项特定的业务操作。它只依赖领域中的仓储协议。

// Domain/UseCases/FetchUserUseCase.swift
struct FetchUserUseCase {
  let repo: UserRepository
  func execute(id: Int) async throws -> User {
    try await repo.getUser(id: id)
  }
}

领域中的仓储协议

仓储协议定义数据访问契约。协议由领域层拥有,数据层提供具体实现。

// Domain/Repositories/UserRepository.swift
protocol UserRepository {
  func getUser(id: Int) async throws -> User
  func saveUser(_ user: User) async throws
}

数据层

数据层使用具体技术(URLSession、Core Data、SwiftData、Keychain)实现领域协议。

// Data/Repositories/RemoteUserRepository.swift
struct RemoteUserRepository: UserRepository {
  func getUser(id: Int) async throws -> User {
    let data = try await URLSession.shared.data(from: userURL(id)).0
    return try JSONDecoder().decode(User.self, from: data)
  }
  func saveUser(_ user: User) async throws { /* PUT request */ }
}

数据传输对象

数据传输对象是数据层使用的可编码类型,用于解码接口响应,然后映射为领域实体。

struct UserDTO: Decodable {
  var user_id: Int
  var full_name: String
  func toDomain() -> User { User(id: user_id, name: full_name, email: "") }
}

表现层

表现层包含 ViewModels 和 SwiftUI 视图。它调用用例并公开可观察状态。

// Presentation/ViewModels/ProfileViewModel.swift
@MainActor
final class ProfileViewModel: ObservableObject {
  @Published var user: User?
  private let useCase: FetchUserUseCase
  init(useCase: FetchUserUseCase) { self.useCase = useCase }
  func load(id: Int) async {
    user = try? await useCase.execute(id: id)
  }
}

依赖方向

依赖指向内部:表现层依赖领域层,数据层依赖领域层。领域层不依赖任何内容。

// Outer → Inner dependency rule:
Presentation → Domain ← Data
// Domain is the stable core; outer layers are swappable

文件夹结构

对于大型应用,请先按层次、再按功能组织 Swift 文件。

// MyApp/
// ├── Domain/
// │   ├── Entities/
// │   ├── UseCases/
// │   └── Repositories/  (protocols)
// ├── Data/
// │   └── Repositories/  (implementations)
// └── Presentation/
//     ├── Views/
//     └── ViewModels/

优点

分层架构支持独立测试、可替换实现以及团队并行开发。

// Test Domain in isolation: no network, no DB
// Swap RemoteUserRepo with LocalUserRepo for offline mode
// Teams own layers independently

常见错误

避免在领域层导入 UIKit 或 SwiftUI,也要避免业务逻辑泄漏到视图中。

// WRONG: Domain entity with SwiftUI Color
struct Product {
  var color: Color  // UIKit/SwiftUI import in Domain!
}
// CORRECT: Use a plain string or enum
struct Product { var colorHex: String }

快速检查

在清晰架构中,哪个层拥有仓储协议?

课程回顾

清晰架构分为多个层次:领域层(实体、用例、协议契约)、数据层(网络和数据库实现)、表现层(用户界面和 ViewModels)。依赖指向领域层。领域层完全不依赖框架,因此可以进行完整的单元测试。

常见问题解答

「分层:领域、数据与表示层」课时是免费的吗?

是的 — 「分层:领域、数据与表示层」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「分层:领域、数据与表示层」这节课中我会学到什么?

在 Swift 应用中将业务逻辑与数据访问、用户界面分离。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「分层:领域、数据与表示层」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 分层:领域、数据与表示层
  2. 用例与仓储模式
  3. 使用协议抽象实现依赖倒置
  4. 不使用 DI 框架组装各层
← 返回 Swift Academy