我很清楚Swift中值类型和引用类型之间的区别,并且意识到值类型被设计为不可变的用法。但结构特别有能力改变自己,这是我的担忧。如何有效地使用这些变异的struct值类型,以便它们保持状态或变化。
我的问题是,iOS应用程序MVVM设计中的应该将模型视为类还是结构?由于视图模型包含模型/模型列表,这些模型实例可能会随着时间而变化(例如,视图模型从Web服务请求获取更多模型实例并添加到其模型数组中),视图控制器的视图模型如何通过此更改进行更新。这是一个伪示例,但首先是一些注意事项和简要说明:
示例:
查看型号:
struct DummyViewModel {
private var ints:[Int] = []
var count: Int {
return ints.count
}
init() {}
mutating func fetchData(completionHandler:(NSError? ) -> Void) {
Networking.getDataFromRemote() { response in
self.ints.append(1)
completionHandler(nil)
}
}
}
查看控制器:
class DummyViewController: UIViewController{
private var dummyViewModel: DummyViewModel?
override func viewDidLoad() {
super.viewDidLoad()
/// Setup the view model
dummyViewModel = DummyViewModel()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
loadData()
}
}
private extension DummyViewController {
func loadData() {
dummyViewModel?.fetchData { error in
if self.dummyViewModel?.count > 0 {
print("View model updated")
} else {
print("View model is still same")
}
}
}
}
在上面的代码中,当视图模型获得响应时,它会将数据添加到它的数组中,但该更改永远不会传递给视图控制器,因为在闭包内部,它是视图模型的副本,而不是视图控制器的模型。那么问题是如何将此更改传递给视图控制器?
我是否应该从闭包中返回更新的视图模型实例,并在视图控制器的闭包中更新它的视图模型实例。但这也不会像在视图控制器闭包中那样工作,我也会更新视图模型的副本??
我们该如何处理?一种选择是使视图模型成为一个类,以便所有内容都是引用,并且我们在任何地方都在更新相同的实例。但是,视图模型和模型可能会发生同样的事情,模型也将成为类。我们的应用程序的主要部分是视图控制器,我们创建的视图模型和模型都是类。所以我们真的没有在这里使用价值类型的力量。
有什么建议吗?