Правильно ли, что в Clean Swift (VIP) интерактор отвечает за роутинг?

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

Ответ

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

Распределение ответственности:

  • Interactor: Содержит бизнес-логику. Получает запросы от ViewController, работает с данными (через Workers) и передает сырые результаты Presenter'у.
  • Router: Получает команды на переход от ViewController'а и выполняет навигацию между модулями (экранами).

Пример корректного потока:

// 1. ViewController (реагирует на действие пользователя)
func didSelectRow(at indexPath: IndexPath) {
    router?.routeToDetails(for: data[indexPath.row])
}

// 2. Router (выполняет переход)
func routeToDetails(for item: DataItem) {
    let nextVC = DetailsConfigurator.configure(with: item)
    viewController?.navigationController?.pushViewController(nextVC, animated: true)
}

// 3. Interactor (не участвует в роутинге)
// Его задача — подготовить данные для текущего экрана.

Откуда путаница? Интерактор может передавать данные (например, идентификатор объекта) для следующего экрана, но сам переход всегда инициирует и выполняет Router. Смешивание этих обязанностей нарушает принцип единой ответственности (SRP).