Использовали ли паттерны Router и Coordinator
Что проверяют
Есть ли у вас практика вынесения навигации из контроллеров и понимаете ли вы, какую проблему это решает. Вопрос про опыт, поэтому интервьюер ждёт конкретный проект, а следом спросит про утечки дочерних координаторов и обработку кнопки «назад».
Как отвечать
Сначала разведите понятия:
- Coordinator: объект, который владеет сценарием, например онбордингом или оформлением заказа. Держит
UINavigationController, создаёт контроллеры, передаёт им зависимости и решает, куда идти дальше. Контроллер про следующий экран не знает, он сообщает о событии через делегат или замыкание; - дочерние координаторы: родитель хранит их в массиве
childCoordinatorsи удаляет, когда сценарий завершён; - Router: понятие тоньше. В VIPER это часть модуля, отвечающая за переходы с конкретного экрана. В связке с координаторами роутером часто зовут обёртку над
UINavigationControllerс методамиpush,present,dismiss, которую удобно подменить в тестах.
Каркас ответа про опыт: какое было приложение, почему навигация стала проблемой (переходы размазаны по контроллерам, диплинк открывал экран не в том стеке), как устроили координаторы, что получили. Добавьте конкретику: сколько сценариев вынесли, какие тесты появились.
Для SwiftUI скажите, как это выглядит сейчас: координатор становится @Observable объектом с массивом маршрутов для NavigationStack(path:), а экраны строятся в navigationDestination.
Если опыта нет, не придумывайте проект. Честно расскажите, как навигация была устроена у вас (сегвеи, переходы прямо из контроллера), какие неудобства это давало, и опишите, как перенесли бы один сценарий на координатор.
Где спотыкаются
Забывают удалять дочерний координатор после завершения сценария. Он продолжает жить вместе со своими контроллерами, утечку видно в Memory Graph Debugger.
Не обрабатывают системную кнопку «назад» и свайп. Координатор не узнаёт, что экран закрыт, и его состояние расходится со стеком. Лечится через UINavigationControllerDelegate и navigationController(_:didShow:animated:).
Превращают один координатор в god object на всё приложение. Координаторов должно быть столько, сколько сценариев.