Ты не должен. Это распространенное заблуждение, что 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
это вручную связывает с просмотром, который требует ссылки EO, переданной ему.
Приведенный выше код является MVVM. Например; модель с привязкой к виду.
Но поскольку модель является типом значения, то вместо рефакторинга модели и состояния
Для просмотра модели вы реорганизуете управление (например, в расширении протокола).
Это официальный SDK, адаптирующий шаблон дизайна к языковой функции, а не просто
навязывая это. Приоритет содержания над формой.
Посмотрите на ваше решение, вы должны использовать синглтон, который в основном глобальный. Вы
должен знать, насколько опасно получать доступ к глобальным ресурсам без защиты
неизменность, которой у вас нет, потому что вы должны использовать модель ссылочного типа!
TL; DR
Вы не делаете MVVM Java-способом в SwiftUI. И Свифт-й способ сделать это не нужно
чтобы сделать это, это уже встроено.
Надеюсь, что больше разработчиков увидят это, так как это кажется популярным вопросом.