Какую роль выполняет Router в архитектуре Clean Swift (VIP)?

«Какую роль выполняет Router в архитектуре Clean Swift (VIP)?» — вопрос из категории Архитектура, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Clean Swift (VIP-цикл) Router отвечает за навигацию между модулями (сценами) и передачу данных между ними. Его цель — инкапсулировать логику перехода от одного экрана к другому.

Основные обязанности Router:

  1. Создание следующего модуля (ViewController, Interactor, Presenter, Router, Configurator).
  2. Передача данных (DataStore -> DataStore) между модулями.
  3. Вызов навигационных методов (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.