你不应该 常见的误解是,SwiftUI与MVVM配合使用效果最佳。
MVVM在SwfitUI中没有位置。您在问是否可以将矩形推到
适合三角形。不适合
让我们从一些事实开始,并逐步进行工作:
ViewModel是MVVM中的模型。
MVVM不考虑值类型(例如,java中没有这样的东西)。
值类型模型(无状态模型)被认为比参考安全
不变性意义上的类型模型(具有状态的模型)。
现在,MVVM要求您以这样一种方式建立模型:
以某种预定的方式更新视图。这称为绑定。
没有约束力,您将无法很好地分离关注点,例如;重构
模型和关联状态,并使它们与视图分离。
这是大多数iOS MVVM开发人员失败的两件事:
iOS没有传统Java意义上的“绑定”机制。
有些人只是忽略绑定,而认为调用对象ViewModel
自动解决所有问题;有些人会引入基于KVO的Rx,并且
当MVVM使事情变得更简单时,一切都会变得复杂。
有状态的模型太危险了
因为MVVM过分强调ViewModel,而过分强调状态管理
管理控制的一般学科;大多数开发商最终
认为具有用于更新视图的状态的模型是可重用的,并且
可测试的。
这就是为什么Swift首先引入值类型的原因。没有模型
州。
现在,您的问题是:您问您的ViewModel是否可以访问EnvironmentObject(EO)?
你不应该 因为在SwiftUI中,符合View的模型会自动具有
参考EO。例如;
struct Model: View {
@EnvironmentObject state: State
// automatic binding in body
var body: some View {...}
}
希望人们能够欣赏紧凑型SDK的设计方式。
在SwiftUI中,MVVM是自动的。无需单独的ViewModel对象
手动绑定到需要传递EO参考的视图。
上面的代码是 MVVM。例如; 具有绑定到视图的模型。
但是因为模型是值类型,所以与其将模型和状态重构为
视图模型中,您可以重构控制(例如,在协议扩展中)。
这是官方的SDK,可根据语言功能调整设计模式,而不仅仅是
强制执行。实质重于形式。
查看您的解决方案,您必须使用基本上是全局的单例。您
应该知道在没有保护的情况下在任何地方访问全局有多危险
不变性,这是没有的,因为您必须使用引用类型模型!
TL; DR
您不会在SwiftUI中以Java方式执行MVVM。不需要Swift-y方法
为此,它已经内置。
希望更多的开发人员能够看到这一点,因为这似乎是一个受欢迎的问题。