What is the Coordinator pattern in iOS?
Answer
The Coordinator pattern (by Soroush Khanlou) extracts navigation logic from ViewControllers into dedicated Coordinator objects. It solves the "Massive ViewController" problem and makes navigation testable and reusable. Protocol: protocol Coordinator: AnyObject { var childCoordinators: [Coordinator] { get set } var navigationController: UINavigationController { get set } func start() }. Implementation: class AppCoordinator: Coordinator { var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController init(navigationController: UINavigationController) { self.navigationController = navigationController } func start() { let homeCoordinator = HomeCoordinator(navigationController: navigationController) homeCoordinator.delegate = self homeCoordinator.parentCoordinator = self childCoordinators.append(homeCoordinator) homeCoordinator.start() } } class HomeCoordinator: Coordinator { var childCoordinators: [Coordinator] = [] var navigationController: UINavigationController weak var delegate: AppCoordinator? func start() { let vc = HomeViewController() vc.coordinator = self // ViewController knows its coordinator navigationController.pushViewController(vc, animated: false) } func showDetail(for item: Item) { let vc = DetailViewController(item: item) vc.coordinator = self navigationController.pushViewController(vc, animated: true) } func coordinatorDidFinish(_ coordinator: Coordinator) { childCoordinators.removeAll { $0 === coordinator } } }. Benefits: VCs are free of navigation code; navigation logic is testable; coordinators are reusable; clear ownership of child flows. Deinitialization: when a coordinator's flow completes, it removes itself from parent's childCoordinators. SwiftUI + Coordinator: less common — NavigationPath and @NavigationDestination handle navigation declaratively.