レイヤー:ドメイン、データ、プレゼンテーション
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- レイヤー:ドメイン、データ、プレゼンテーション
- ユースケースとリポジトリパターン
- プロトコル抽象化による依存性逆転
- DIフレームワークを使わずにレイヤーを接続する