SwiftUI MVVM模式是否正确应用?

SwiftUI MVVM模式是否正确应用?,mvvm,swiftui,Mvvm,Swiftui,我不确定我是否将MVVM模式正确地应用于我的情况。 如果有什么问题或者可以改进,你能给我一些反馈吗 入口点是Appstruct,它创建Router和PageService。 这些实例作为环境对象传递给所有视图 @main struct App: App { var router = Router() var pageService = PageService() var body: some Scene { WindowGroup {

我不确定我是否将MVVM模式正确地应用于我的情况。 如果有什么问题或者可以改进,你能给我一些反馈吗

入口点是
App
struct,它创建
Router
PageService
。 这些实例作为环境对象传递给所有视图

@main
struct App: App {
    var router = Router()
    var pageService = PageService()
    
    var body: some Scene {
        WindowGroup {
            RootView()
                .environmentObject(router)
                .environmentObject(pageService)
        }
    }
}
然后在我的
RootView
中创建一个
TabBarView
,其中包含一些
TabBarItemViews
。 下面的代码显示了我的设置(我删除了不重要的内容,希望不会更多):

ViewModels创建(包括PageService注入)的位置是否正确? 有没有办法在视图中创建TabBarViewModel并注入PageService

非常感谢大家

视图、它们的视图(状态、业务逻辑等)模型和应用程序数据模型看起来都很好地分开,因此fwiw示例对我来说很好-尤其是如果完整代码正常工作的话:-)

在MVVM细化方面;我看到有人建议:

  • 将视图模型放在视图的扩展中是明智的,因为它们几乎从未在其他任何地方重用过,这使组织变得更容易
  • 使用协议指定模型参数是一种很好的做法,因为它允许更大的灵活性,特别是在测试期间使用模拟对象方面
关于以上内容的更多细节,Kilo Loco在YouTube上的关于这个主题的短片很好,可以找到


祝你好运,玩得开心。

非常感谢你的回答和改进。
struct RootView: View {    
    @EnvironmentObject var pageService: PageService
    
    var body: some View {
        TabBarView(vm: TabBarViewModel(pageService: pageService))
    }
}
struct TabBarView: View {
    @StateObject var vm: TabBarViewModel
    
    var body: some View {
        ForEach(self.vm.tabs, id: \.id) { tab in
            TabBarItemView(vm: tab)
        }
    }
}
class TabBarViewModel: ObservableObject {
    @Published var tabs = [TabBarItemViewModel]()
    var pageService: PageService
        
    init(pageService: PageService) {
        self.pageService = pageService
        self.tabs = self.pageService.fetchPages()
            .map(TabBarItemViewModel.init)
    }
}
struct TabBarItemView: View {
    @EnvironmentObject var router: Router
    @StateObject var vm: TabBarItemViewModel
    
    var body: some View {
        Text(String(self.vm.id))
        // using router to show selected item highlighted etc
    }
}
class TabBarItemViewModel: ObservableObject {
    @Published var page: Page
        
    init(_ page: Page) {
        self.page = page
    }
        
    var id: Int {
        return self.page.id
    }
}