Вопрос проверяет умение применять паттерн координаторов (Coordinators) для навигации без прямых ссылок между контроллерами.
Создайте базовый протокол Coordinator с методами start() и свойством childCoordinators. Для экрана логина — AuthCoordinator, для основного — MainCoordinator. Когда логин успешен, из AuthCoordinator вызываете finish(), а из родительского AppCoordinator запускаете MainCoordinator и меняете корневой контроллер.
Протокол координатора:
protocol Coordinator {
var childCoordinators: [Coordinator] { get set }
func start()
}AppCoordinator:
class AppCoordinator: Coordinator {
var window: UIWindow
var childCoordinators = [Coordinator]()
func start() {
if isLoggedIn { showMain() } else { showAuth() }
}
func showAuth() { /* создаём AuthCoordinator, start() */ }
func showMain() { /* создаём MainCoordinator, start() */ }
}Переключение:
В AuthCoordinator после успешного входа:
parent.childCoordinators.remove(self)
parent.showMain()Аналогично при логауте.
Преимущества:
Нет «мусора» в контроллерах.
Понятная ответственность: координатор берёт на себя навигацию.
Вывод:
Координаторы дают гибкость и лёгкость тестирования навигации, чётко разделяя зоны ответственности.