SwiftUI NavigationLink报错:无法将GameViewModel.Type转为GameViewModel类型
报错根因
你触发报错的核心原因是GameViewModel的初始化写法完全不符合Swift语法规则:
你代码里写的Engine.self、Storage.self、StateTracker.self取到的是对应类的类型本身,不是可使用的实例对象,你用as!强转类型为实例必然不匹配,所以编译直接抛出Cannot convert value of type 'GameViewModel.Type' to expected argument type 'GameViewModel'的错误。
而你尝试删掉viewModel参数报错,是因为GameView结构体明确声明了必须传入viewModel参数,属于必填入参,不能省略。
修复方案
你只需要在父视图ContentView中提前实例化好GameViewModel需要的所有依赖,再生成实例传给GameView即可,修复后的代码如下:
import SwiftUI import Foundation struct ContentView: View { // iOS14+推荐用@StateObject持有ObservableObject实例 @StateObject private var gameViewModel = GameViewModel( Engine(), // 这里传Engine的实例,不要加.self storage: Storage(), // 传Storage实例 stateTracker: StateTracker() // 传StateTracker实例 ) @State private var score = 0 var body: some View { NavigationView { Image("Clouds") .overlay( VStack { NavigationLink(destination: ResultView2(choice: "Menu2")) { Image("Menu2") } // 直接传入已经实例化好的viewModel NavigationLink(destination: GameView(viewModel: gameViewModel)) { Image("Menu") } }) } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } } // 剩余的GameView、ResultView2代码保持不变即可
兼容说明
如果你的项目需要兼容iOS13,把@StateObject替换为@ObservedObject即可使用,只要保证父视图不会频繁重绘导致ViewModel重复初始化就不会有问题。
内容的提问来源于stack exchange,提问作者sUnit1
相关产品推荐
相关产品推荐

