Ответ
В Clean Swift (VIP-цикл) Router отвечает за навигацию между модулями (сценами) и передачу данных между ними. Его цель — инкапсулировать логику перехода от одного экрана к другому.
Основные обязанности Router:
- Создание следующего модуля (ViewController, Interactor, Presenter, Router, Configurator).
- Передача данных (DataStore -> DataStore) между модулями.
- Вызов навигационных методов (
push,present,pop).
Пример реализации:
// 1. Протокол Router из текущего модуля
protocol ListRoutingLogic {
func routeToDetail(withId id: String)
}
// 2. Класс Router
class ListRouter: NSObject, ListRoutingLogic {
weak var viewController: ListViewController? // Weak reference
var dataStore: ListDataStore? // Доступ к данным текущего модуля
// MARK: - Routing
func routeToDetail(withId id: String) {
// 3. Создаем следующий модуль (обычно через Configurator)
let detailVC = DetailViewController()
DetailConfigurator.configureModule(viewController: detailVC)
// 4. Передаем данные из DataStore текущего модуля в DataStore следующего
if let sourceDS = dataStore,
let destinationDS = detailVC.router?.dataStore {
destinationDS.selectedItemId = id
}
// 5. Выполняем навигацию
viewController?.navigationController?.pushViewController(detailVC, animated: true)
}
}
Ключевые принципы:
- Слабая связность: Router знает только о протоколах, а не о конкретных классах.
- Тестируемость: Навигацию можно тестировать через моки протоколов.
- Ответственность: Router не содержит бизнес-логики — только логику перехода. Вся подготовка данных должна быть выполнена в Interactor/Presenter до вызова Router.