You need to enable JavaScript to run this app. SwiftUI NavigationLink报错:无法将GameViewModel.Type转为GameViewModel类型
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 20:36:03