gpt4 book ai didi

mvvm - 我应该在哪里为 SwiftUI 中的 View 创建模型实例?

转载 作者:行者123 更新时间:2023-12-03 10:25:17 25 4
gpt4 key购买 nike

我是 MVVM 的新手。据我了解,我必须避免在 View 结构中使用模型代码。

就我而言,我有 2 个 View ,MainView 和 ChildView。 MainView 没有 ViewModel。但是 ChildView 有一个 ViewModel(例如 ChildViewModel)。由于ChildViewModel只在ChildView中使用,所以我没有在EnvironmentObject上注册模型实例或者我没有将实例传递给MainView,因为MainView根本不使用模型。

我认为,最好的方法是 ChildView 自己创建自己的模型实例,如下所示。但我不确定它是否可以。这是否违反了 MVVM 的规则?

struct ChildView: View {
@ObservedObject var childViewModel = ChildViewModel()

var body: some View { ... }
}

提前致谢。

最佳答案

我同意接受的答案。我会提供我的论点。
MVVM 不是关于拥有一个称为 View 模型的对象。大多数 MVVM 开发人员只是为了拥有一个称为 View 模型的对象而这样做。

because MVVM about "responsibility separation"


什么设计模式不是关于职责分离的?
为什么你认为 SwiftUI SDK 设计没有提供职责分离?

I must avoid using model code inside a view struct


first view struct 不是 View ,它是符合 View 的模型。
例如。; struct Model: View这是为了让您可以轻松地进行模型 -> View 绑定(bind)(以及可选的 View -> 模型绑定(bind))。
有像 @State 这样的注解, @StateObject专为支持它而构建。
例如。;在 @State 时重新渲染更改,编译器检查以防止访问 @State来自外部的对象 struct Model: View .
换句话说, struct Model: View是写模型代码的地方!按设计!
注意是 struct Model ,而不是 class Model . MVVM 不考虑值类型。因此,MVVM 没有利用值类型的不变性,而是让您相信 中的单独模型引用类型 是个好主意吗?它不是。
我要再说一遍。 “职责分离”的 REFERENCE 类型的模型。
您必须创建一个单独的 View 模型有一些遗留原因。这取决于绑定(bind)的设计方式。您需要一个单独的 View 模型来绑定(bind)以使用某种通用语言工作,这是完全可行的。
但 Swift 并不是某种通用语言。
我不知道为什么 MVVM 开发人员认为 SwiftUI SDK 的创建者是白痴,对 MVVM 一无所知。事实是,SwiftUI 的绑定(bind)设计如此高效,您不需要单独的 View 模型来描述绑定(bind)。
hell ,即使我可以看到您现在可以充分利用值类型模型的绑定(bind)和自动 View 更新,这是最具标志性的 MVVM 功能,而无需手动创建单独的 View 模型的开销。而且我不是 MVVM 开发人员。
SwiftUI 默认制作 View 模型。我已经看到一次又一次地在它之上构建 View 模型的尝试。他们都惨遭失败,因为 View 模型现在是自重的。
你不需要它,事实上当你使用它时你失去了 SDK 支持。
或者这样想。 SwiftUI 移除了 UIViewController。
您是否看到 MVC 开发人员站出来坚持创建一个单独的 Controller 对象?
同样的论点也适用。例如。;

because MVC is about "responsibility separation", and provided patternis exactly separates View & Control. Moreover it follows "dependencyinjection" rule as well


不要让这些抽象的词迷惑你。有适用于一切的基本原则。
对于您的问题,这是一种低效的 MVVM 形式。 ChildView 应该是您的模型。
这比这些 MVVM 开发人员告诉你的更多 MVVM。
例如。;
struct ChildView: View {
@State var value: Value
@StateObject var resource: JSON
var body: some View { ... }
}

关于mvvm - 我应该在哪里为 SwiftUI 中的 View 创建模型实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61355594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com