目次
					
					
					
					
SwiftUIでクリーンアーキテクチャを導入する方法とそのメリット
SwiftUIでアプリを作っていると、「コードが散らかってきた…」「Viewにロジックが詰まりすぎて読みにくい…」と感じる瞬間はありませんか?
そこでおすすめなのが「クリーンアーキテクチャ」。
この記事では、SwiftUIでクリーンアーキテクチャをどう導入するか、どんなメリットがあるかを初心者にもわかりやすく解説します。
1. クリーンアーキテクチャとは?
「責務を分離して、保守性・テスト性を高める設計思想」のことです。
主な層:
- View層:UI表示のみ
- Presenter / ViewModel層:UI向けの状態や処理
- UseCase層:ビジネスロジックを司る
- Repository層:データ取得の抽象化(API・DBなど)
- Entity層:アプリの基本的なデータ構造
この構造により、ロジックとUIが分離され、スケーラブルなコードになります。
2. SwiftUIでの構造イメージ
MyApp/
├── View/              ← SwiftUIの画面
├── ViewModel/         ← ObservableObjectで状態管理
├── UseCase/           ← アプリ固有の処理
├── Repository/        ← APIやDBとのやり取り
├── Entity/            ← データモデル
└── DI/                ← 依存注入用
実際のプロジェクト構成もこのように分けておくと、自然と役割が明確になります。
3. サンプルコードで解説
「ユーザー名を取得して表示する」というシンプルな例で、各層を紹介します。
① Entity
struct User {
    let id: Int
    let name: String
}
② Repository
protocol UserRepository {
    func fetchUser() async throws -> User
}
final class MockUserRepository: UserRepository {
    func fetchUser() async throws -> User {
        return User(id: 1, name: "太郎")
    }
}
③ UseCase
protocol FetchUserUseCase {
    func execute() async throws -> User
}
final class FetchUserUseCaseImpl: FetchUserUseCase {
    private let repository: UserRepository
    init(repository: UserRepository) {
        self.repository = repository
    }
    func execute() async throws -> User {
        try await repository.fetchUser()
    }
}
④ ViewModel
@MainActor
final class UserViewModel: ObservableObject {
    @Published var userName: String = ""
    private let fetchUserUseCase: FetchUserUseCase
    // DI処理:ここでRepository → UseCaseを初期化
    init() {
        let repository: UserRepository = MockUserRepository()
        self.fetchUserUseCase = FetchUserUseCaseImpl(repository: repository)
    }
    func loadUser() async {
        do {
            let user = try await fetchUserUseCase.execute()
            self.userName = user.name
        } catch {
            self.userName = "エラー"
        }
    }
}
⑤ View
struct UserView: View {
    @StateObject private var viewModel = UserViewModel()
    var body: some View {
        VStack {
            Text(viewModel.userName)
                .font(.title)
            Button("読み込み") {
                Task {
                    await viewModel.loadUser()
                }
            }
        }
        .padding()
    }
}
4. クリーンアーキテクチャ導入のメリット
- コードが読みやすくなる
- Viewのテストがしやすくなる
- スケーラブルで保守しやすい
- 将来的な機能追加やAPI変更にも柔軟に対応
小さなアプリでもこの構成を意識しておくと、後から必ず助かります。
5. まとめ
SwiftUIでクリーンアーキテクチャを導入すると、責任の所在が明確になり、コードの見通しが劇的に改善します。
最初は少し構造が大げさに感じるかもしれませんが、慣れてくるとコードの分離と再利用が快適になります。ぜひあなたのアプリにも取り入れてみてください!
 
					        