【发布时间】:2021-11-06 08:23:51
【问题描述】:
我希望我的 MVVM 架构有一个作为模型的类和一个作为视图模型或视图控制器的结构。这是因为我想通过更改模型重新初始化一堆属性,并且使用一个类作为视图模型只允许一个初始化。但是,它还没有找到一种方法让视图观察视图模型中的新结构/结构的变化。
我的问题示例:
class Model: ObservableObject {
var nums: [Int]
init() {
self.nums = Array(1..<100)
}
func getNum() -> Int {
return nums.count
}
func add() {
nums.append(nums.count + 1)
self.objectWillChange.send()
}
}
struct ViewModel {
var model: Model
var num: Int
init(model: Model) {
self.model = model
self.num = model.getNum()
}
func trigger() {
model.add()
print("Triggered")
}
}
struct ContentView: View {
var viewModel: ViewModel
var body: some View {
Button(action: {viewModel.trigger() }) {
Text("Press")
}
Text("Number of Elements")
Text("\(viewModel.num)")
}
}
var model = Model()
var viewModel = ViewModel(model: model)
var view = ContentView(viewModel: viewModel)
@main
struct app: App {
var body: some Scene {
WindowGroup {
view
}
}
}
【问题讨论】:
-
你的
ViewModel的初始化器改变了Model。这似乎很糟糕。为什么要显示好友数修改好友数? -
正如上面的评论所暗示的,这似乎是一个奇怪的例子。
num永远不会在视图模型的初始化程序之外发生变异。我对这里期望的行为感到困惑。一般来说,这种方法与您的模型的传统路径是struct和您的视图模型是class的传统路径相反 -
我已经编辑了示例以避免在 init 中改变数组
-
Num 确实通过按钮在视图级别发生了变异
-
不,它没有。
nums会。
标签: swift struct observable viewmodel