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

Ответ

Нет, это неверно. В архитектуре 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).

Ответ 18+ 🔞

А, ну ты глянь, опять кто-то накосячил с распределением ролей в Clean Swift, как будто в первый раз! Ёпта, народ, ну вы что, реально?

Слушай сюда, раз и навсегда, чтобы в голове осело, как гвоздь в доску: за навигацию в VIP-цикле отвечает РОУТЕР, а не интерактор! Это как путать повара с официантом. Один готовит, другой носит. И не наоборот, блядь!

Кто за что в ответе, чтобы не пиздец был:

  • Interactor (Интерактор): Это у нас мозги операции, ёпта. Сидит себе в подвале, получает задачу от вьюконтроллера, ковыряется в данных через воркеров, логику всякую проверяет и выдает сырой результат презентеру. Никаких переходов нахуй! Его дело — бизнес, а не экраны переключать. Представь, бухгалтер вдруг начинает мебель по офису таскать — вот это и есть интерактор, который лезет в роутинг.

  • Router (Роутер): А вот это уже наш курьер, навигатор, проводник в мир других модулей. Получает четкую команду от вьюконтроллера: «Вася, отвези эту посылку (данные) на следующий экран!» — и хуяк, делает свою работу. Никакой логикой не пахнет, только переходы.

Вот как это должно выглядеть, без всяких выебонов:

// 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), после которого код превращается в такое месиво, что разгребать его — терпения ноль ебать. Не делайте так, а то Тургенев отдыхает!