Coordinatorパターン
ナビゲーションフローのロジックを一元化します。
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- MVVMパターン
- ViewModelとViewのバインディング
- Coordinatorパターン
- ViewModelのテスト