Добавить объявление

Структура SwiftUI-проекта, которая не разваливается с ростом

Стандартная структура от Xcode - это ловушка. ContentView.swift, пара папок, и вот уже через три месяца вы не можете найти, где лежит экран настроек, потому что он затерялся среди 50 других файлов в одной куче. Чтобы проект жил долго и счастливо, нужна система. И желательно с первого дня.

Главная ошибка - группировка по типам:


Самое популярное, но неудачное решение: папки Views, Models, ViewModels. Вроде логично, но когда в Views оказывается 40 файлов, а в Models - 20, вы начинаете тратить время на поиск. Хуже того, связанные сущности разбросаны по разным местам. Чтобы понять, как работает авторизация, нужно открыть три папки и собрать пазл.

Фичевая организация - спасательный круг:


Гораздо удобнее группировать код по функционалу. Каждая фича - отдельная папка, внутри которой лежит все необходимое: вьюхи, модели, вью-модели, кастомные компоненты, специфичные для этой фичи. Если нужно поправить экран профиля, вы идете в папку Profile и видите все, что к нему относится. Никаких блужданий по проекту.

Что вынести за пределы фич:


Не все должно жить внутри фич. Есть вещи, которые используются по всему приложению:

  • Core: сеть, хранилище, базовые сервисы. Один экземпляр на все приложение, инициализируется один раз.

  • UI Components: переиспользуемые кнопки, поля ввода, лоадеры. Чтобы не писать один и тот же стиль в каждом экране.

  • Theme: цвета, шрифты, отступы. Единое место, где живет дизайн-система.

  • Extensions: полезные расширения для стандартных типов.

  • Resources: ассеты, локализация, шрифты.

ViewModel с человеческим лицом:


Каждая вью-модель должна быть аккуратной и предсказуемой. Несколько правил:

  • @MainActor - чтобы не думать о потоках при обновлении UI.

  • private(set) для публикуемых свойств - никто не должен менять состояние извне.

  • Зависимости через инициализатор - чтобы можно было подменить их в тестах.

  • Методы, которые четко отражают действия пользователя.

Навигация без боли:


Для простых приложений хватает встроенного NavigationStack с navigationDestination. Когда экранов становится много, стоит задуматься о координаторе. Один класс, который управляет всей навигацией в приложении - это сильно упрощает жизнь, особенно когда нужно передавать данные между экранами или обрабатывать диплинки.

Главное - последовательность:


Любая структура работает, если ей следовать. Хуже всего кога часть кода лежит по фичам, часть - по типам, часть - вообще в корне. Выберите один подход и придерживайтесь его от начала до конца. Новые разработчики в команде скажут спасибо.

Вывод:


Организация проекта - это не про «красивую структуру», а про скорость разработки и стоимость поддержки. Когда на поиск нужного файла уходит 10 секунд вместо 5 минут, когда новая фича не ломает старую, когда код понятен даже тем, кто видит его впервые - это и есть правильная архитектура. А начинается она с правильной структуры папок.
14.03.2026 51 563