Джерело
Затишна Галера | iOSКомпас 🧭1️⃣7️⃣4️⃣ Завдання 174Яка структура SwiftUI-проєкту повинна...
352 Охват/переглядів
2026-09-30 08:37
Повідомлення №3002
#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
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