#iOSКомпас 🧭
1️⃣7️⃣4️⃣ Завдання 174
Яка структура SwiftUI-проєкту повинна бути щоб проєкт не розвалився з ростом?Доброго здровля мої любі друзі. З вами ваш незмінний ios розробник Сергій з
@badlinkschannel.
Стандартної структури 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 хвилин, коли межі між фічами зрозумілі, коли код читається навіть тими, хто бачить його вперше - ось тоді структура працює. І правильна організація папок - один із перших кроків до цього.
@Zatishna_Galera