Ви не повинні. Загальна помилка, що SwiftUI найкраще працює з MVVM.
MVVM не має місця в SwfitUI. Ви просите, чи можете ви засунути прямокутник до
підходять під форму трикутника. Це не підходило б.
Почнемо з деяких фактів і покроково працюємо:
ViewModel - модель в MVVM.
MVVM не приймає до уваги тип значення (наприклад, такого немає у Java).
Модель типу цінності (модель без стану) вважається більш безпечною, ніж еталонною
модель типу (модель зі станом) у сенсі незмінюваності.
Тепер, MVVM вимагає, щоб ви створили модель таким чином, що коли б вона не змінювалася, вона змінювалась
оновлення перегляду певним чином. Це відомо як зв'язування.
Без прив’язки у вас не буде приємного роз'єднання питань, наприклад; рефакторинг
модель та асоційовані стани та зберігаючи їх окремо від перегляду.
Це дві речі, у яких більшості розробників iOS MVVM не вдається:
iOS не має механізму "прив'язки" в традиційному сенсі Java.
Деякі просто ігнорують прив'язку та думають викликати об’єкт ViewModel
автоматично вирішує все; деякі з них запровадять Rx на базі KVO та
ускладнити все, коли MVVM повинен спростити справи.
модель зі станом просто надто небезпечна
тому що MVVM приділяє занадто багато уваги ViewModel, занадто мало - державному управлінню
та загальні дисципліни з управління контролю; більшість розробників в кінцевому підсумку
мислення модель зі станом, яка використовується для оновлення перегляду, є багаторазовою і
перевіряється .
саме тому Swift вводить в першу чергу тип значення; модель без
держава.
Тепер до вашого питання: ви запитуєте, чи може ваш ViewModel мати доступ до EnvironmentObject (EO)?
Ви не повинні. Тому що в SwiftUI є модель, яка відповідає програмі View автоматично
посилання на ЕО. Наприклад;
struct Model: View {
@EnvironmentObject state: State
// automatic binding in body
var body: some View {...}
}
Я сподіваюся, що люди зможуть оцінити, наскільки компактний SDK розроблений.
У SwiftUI MVVM працює автоматично . Немає потреби в окремому об’єкті ViewModel
що вручну прив'язується до перегляду, що вимагає переданої на нього посилання на ЕО.
Наведений вище код - MVVM. Наприклад; модель із прив’язкою для перегляду.
Але оскільки модель є значенням типу, то замість того, щоб переробляти модель і стан як
Перегляньте модель, ви рефакторируете контроль (наприклад, у розширенні протоколу).
Це офіційний SDK, адаптуючи модель дизайну до мовної функції, а не просто
її виконання. Речовина над формою.
Подивіться на ваше рішення, ви повинні використовувати одиночну, яка в основному є глобальною. ви
Потрібно знати, наскільки небезпечним є доступ до глобального місця будь-де без захисту
незмінність, якої у вас немає, оскільки ви повинні використовувати модель еталонного типу!
TL; DR
Ви не робите MVVM на Java у SwiftUI. І швидкий спосіб зробити це не потрібно
щоб це зробити, це вже вбудовано.
Сподіваюся, більше розробників побачить це, оскільки це здавалося популярним питанням.