0Pricing
Swift Academy · レッスン

レイヤー:ドメイン、データ、プレゼンテーション

SwiftアプリでビジネスロジックをデータアクセスやUIから分離します。

「レイヤー:ドメイン、データ、プレゼンテーション」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

SwiftにおけるClean Architecture

Clean Architectureでは、コードをドメイン(ビジネスロジック)、データ(永続化・ネットワーク)、プレゼンテーション(UI)の各層に分離します。

// 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

ドメインにおけるユースケース

ユースケースは、特定の1つのビジネス処理をカプセル化します。ドメインで定義されたリポジトリプロトコルのみに依存します。

// 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 */ }
}

データ転送オブジェクト

DTOはデータ層で使用するCodable型です。APIレスポンスをデコードし、その後ドメインエンティティに変換します。

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

プレゼンテーション層

プレゼンテーション層には、ViewModelと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 }

確認問題

Clean Architectureでリポジトリプロトコルを所有するのはどの層ですか。

学習内容のまとめ

Clean Architectureの各層は、ドメイン(エンティティ、ユースケース、プロトコルの契約)、データ(ネットワーク・DBの実装)、プレゼンテーション(UIとViewModel)です。依存関係はドメインに向かって内側を向きます。ドメインにはフレームワークへの依存が一切ないため、完全にユニットテスト可能です。

よくある質問

「レイヤー:ドメイン、データ、プレゼンテーション」レッスンは無料ですか?

はい。「レイヤー:ドメイン、データ、プレゼンテーション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「レイヤー:ドメイン、データ、プレゼンテーション」で何を学びますか?

SwiftアプリでビジネスロジックをデータアクセスやUIから分離します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「レイヤー:ドメイン、データ、プレゼンテーション」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. レイヤー:ドメイン、データ、プレゼンテーション
  2. ユースケースとリポジトリパターン
  3. プロトコル抽象化による依存性逆転
  4. DIフレームワークを使わずにレイヤーを接続する
← Swift Academyに戻る