Swift Academy · レッスン

Coordinatorパターン

ナビゲーションフローのロジックを一元化します。

レッスン 3/413 ステップ

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

ナビゲーションの課題

ビューが別のビューを直接プッシュしたり表示したりすると、ナビゲーションのロジックがアプリ全体に分散します。各画面が次の画面を把握する必要があるため、強く結合されてしまいます。

Coordinatorパターンは、ナビゲーションを専用のオブジェクトに切り出すことで、この問題を解決します。

Coordinatorとは

Coordinatorは、ナビゲーションフローの管理だけを担当するオブジェクトです。次に表示する画面を決定し、表示するビューコントローラやビューを生成します。

ビューはルーティングを意識しなくなり、イベントを通知するだけで、Coordinatorが処理内容を決定します。

Coordinatorプロトコル

多くの実装では、すべてのCoordinatorが準拠する小さなプロトコルから始めます。

protocol Coordinator: AnyObject {
    var childCoordinators: [Coordinator] { get set }
    func start()
}

具体的なCoordinator

具体的なCoordinatorはナビゲーションコントローラを所有し、start()で最初の画面を構築します。

final class AppCoordinator: Coordinator {
    var childCoordinators: [Coordinator] = []
    let navigationController: UINavigationController

    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }

    func start() {
        let vc = HomeViewController()
        navigationController.setViewControllers([vc], animated: false)
    }
}

ビューとルーティングの分離

主なメリットは、ビューが次の画面を構築しなくなることです。代わりに、ビューはイベントが発生したことをCoordinatorに伝え、Coordinatorがルーティングします。

これにより、画面のコードを変更せずに、異なるフローで再利用できます。

イベントを上位へ通知する

ビューはデリゲートまたはクロージャを介してCoordinatorと通信します。ビューは次にどこへ遷移するかを把握しません。

protocol HomeViewControllerDelegate: AnyObject {
    func homeDidSelectProfile()
}

final class HomeViewController: UIViewController {
    weak var delegate: HomeViewControllerDelegate?

    func profileTapped() {
        delegate?.homeDidSelectProfile()
    }
}

ルートを処理する

Coordinatorはデリゲートに準拠し、イベントが発生したときのナビゲーション方法を決定します。

extension AppCoordinator: HomeViewControllerDelegate {
    func homeDidSelectProfile() {
        let profile = ProfileViewController()
        navigationController.pushViewController(profile, animated: true)
    }
}

子Coordinator

大規模なフロー(オンボーディングや購入手続き)には、それぞれ子Coordinatorを用意します。親Coordinatorは子Coordinatorを開始し、存続させるためにchildCoordinatorsへ保持します。

func startOnboarding() {
    let child = OnboardingCoordinator(navigationController: navigationController)
    childCoordinators.append(child)
    child.start()
}

メモリリークを防ぐ

親Coordinatorは子Coordinatorを保持するため、フローが終了したら子Coordinatorを削除する必要があります。削除しないとメモリリークが発生します。一般的な方法は、完了コールバックを使うことです。

func childDidFinish(_ child: Coordinator) {
    childCoordinators.removeAll { $0 === child }
}

SwiftUIでのCoordinator

SwiftUIでは、CoordinatorがNavigationStackのパスを操作することがよくあります。Coordinatorが監視可能なパスを所有し、ビューがそこへルートを追加します。

final class Router: ObservableObject {
    @Published var path: [Route] = []

    func push(_ route: Route) {
        path.append(route)
    }
}

enum Route: Hashable { case profile, settings }

メリットのまとめ

Coordinatorパターンには、次のメリットがあります。

  • ナビゲーションをハードコードしない再利用可能なビュー
  • 変更しやすいフローのロジックの一元化
  • UIから分離されたテスト可能なルーティング
  • 子Coordinatorによる組み合わせ可能なフロー

理解度チェック

Coordinatorについての理解度を確認しましょう。

まとめ

Coordinatorパターンについて学びました。

  • Coordinatorがナビゲーションを管理し、ビューをルーティングから切り離す
  • ビューはデリゲートやクロージャを介してイベントを上位へ通知する
  • 子Coordinatorで自己完結型のフローを表現する
  • メモリリークを防ぐため、フローの終了時に子Coordinatorを削除する

MVVMと組み合わせることで、Coordinatorはクリーンでテストしやすいアーキテクチャを完成させます。

無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「Coordinatorパターン」レッスンは無料ですか?

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

「Coordinatorパターン」で何を学びますか?

ナビゲーションフローのロジックを一元化します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「Coordinatorパターン」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. MVVMパターン
  2. ViewModelとViewのバインディング
  3. Coordinatorパターン
  4. ViewModelのテスト
← Swift Academyに戻る