You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI:如何从NavigationLink创建的视图初始化ObservedObject?

解决SwiftUI中NavigationLink的"Generic parameter 'C0' could not be inferred"错误

嘿,作为SwiftUI新手遇到这种类型推断错误太正常了,我来帮你捋清楚问题出在哪以及怎么解决!

问题根源

你在Results视图的自定义初始化方法里直接给@ObservedObject修饰的jobDetailService赋值,这其实违反了SwiftUI属性包装器的初始化规则。@ObservedObject是一个属性包装器,它的底层存储类型是ObservedObject<JobDetailService>,直接给jobDetailService赋值相当于跳过了属性包装器的正确初始化流程,导致编译器无法正确推断NavigationLink所需的泛型参数(也就是报错里的C0)。

解决方案

修改Results视图的初始化方法,通过下划线访问属性包装器的底层实例,并用ObservedObject(wrappedValue:)来完成初始化:

struct Results: View {
    var jobId: String
    @ObservedObject var jobDetailService: JobDetailService
    
    init(jobId: String) {
        self.jobId = jobId
        // 正确初始化@ObservedObject的属性包装器
        self._jobDetailService = ObservedObject(wrappedValue: JobDetailService(jobId: jobId))
    }
    
    var body: some View {
        //... 你的视图代码
    }
}

为什么这样能解决?

通过_jobDetailService访问属性包装器本身,并用指定的初始化方法创建它,编译器就能明确识别jobDetailService的类型信息,进而正确推断NavigationLink的泛型参数,错误自然就消失了。

如果你不想自定义初始化方法,也可以把jobDetailService作为参数直接传入Results,这样用默认的成员初始化器也能正常工作:

struct Results: View {
    var jobId: String
    @ObservedObject var jobDetailService: JobDetailService
    
    // 移除自定义init,使用默认的成员初始化器
    var body: some View {
        //... 你的视图代码
    }
}

// 在JobList里的NavigationLink这样使用
NavigationLink(destination: Results(
    jobId: job.jobId,
    jobDetailService: JobDetailService(jobId: job.jobId)
)) {
    EmptyView()
}

这两种方式都能解决你遇到的问题,选哪种取决于你是否希望把JobDetailService的创建逻辑封装在Results内部。

内容的提问来源于stack exchange,提问作者Danny Allen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:35:23