这个问题与RxSwift或MVVM vs MVC无关。这是一个Class vs
Struct问题。(请注意,当模型是结构时,您的注释“使用MVC,因为视图可以引用模型,因此很容易做到”是不正确的,因为您不能将引用传递给结构。)
您如何解决此问题完全取决于您如何从视图控制器过渡到视图控制器。
当视图控制器负责过渡时。
当视图控制器负责过渡时,每个视图控制器将负责制作下一个视图控制器,而每个视图模型将负责制作下一个视图模型。通过使“父”视图模型侦听“子”视图模型(通过委托,回调闭包或可观察的响应)来完成传递回模型。
通过直接创建并呈现下一个视图控制器,或者到达其容器视图控制器(例如导航VC)并告诉其进行转换,视图控制器可以通过segue或“老式方式”进行转换。
由协调员负责过渡。
过渡的新趋势是让协调器类代替视图控制器来处理它。使用此想法,协调器保存模型,并根据需要创建视图控制器。然后,视图模型与协调器对话,而不是(可能创建并)彼此对话。这样,视图控制器便彼此独立。
您可以使视图模型使用委托,闭包回调或Rx Observables与协调器进行对话。
根据您的修改进行更新:
您问拥有它是否不正确
let vc2 = ViewController2(); vc2.viewModel.car =car。答案是肯定的,那是不正确的,但是很接近。
如果视图控制器负责过渡,那么您将看到的是:
// in view controller 1let vc2 = ViewController2()vc2.viewModel = self.viewModel.viewModel2
如果使用协调器,则会看到类似以下内容的信息:
// in coordinatorlet vm2 = ViewModel(car: self.car)let vc2 = ViewController2(viewModel: vm2)
视图模型背后的关键思想不是私有的,不必一定是私有的。关键思想是它是视图控制器持有的唯一非视图对象。您可以将其视为“模型控制器”。



