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

Swift中能否在泛型结构体初始化时使用泛型类型?

解决泛型类型初始化另一个泛型的问题

嘿,我来帮你搞定这个问题!你遇到的Use of undeclared type 'type'错误,核心原因是在解码时误用了参数名作为泛型类型参数——type是你传入的参数变量名,不是实际的泛型类型T。

错误原因拆解

在你的test函数里,JSON<type>这种写法是错误的:type是T.Type类型的参数,而JSON结构体的泛型需要的是具体的类型(也就是T本身),不是参数变量。

修正后的完整代码

struct Object: Decodable { 
    let id: String? 
    let type: String? 
} 

struct JSON<T: Decodable>: Decodable { 
    let data: T? 
} 

func test<T: Decodable>(type: T.Type) { 
    let dataFromAPI = Data() 
    // 这里要使用泛型类型T,而不是参数名type,同时处理解码抛出的错误
    do {
        let model = try JSONDecoder().decode(JSON<T>.self, from: dataFromAPI)
        // 这里可以添加对model的后续操作逻辑
        print("解码成功:\(model)")
    } catch {
        print("解码失败:\(error.localizedDescription)")
    }
}

关键注意点

  • 调用JSONDecoder.decode时,要传入JSON<T>.self作为解码类型,T就是函数定义里的泛型类型参数,和你传入的type参数对应的类型一致。
  • decode方法是抛出错误的,所以必须用do-catch块捕获错误,或者给test函数添加throws关键字,把错误抛给调用者处理。

可选优化:简化函数调用

如果你觉得每次调用都要传type: T.Type有点繁琐,可以通过返回值的类型推断来省略这个参数,修改后的函数如下:

func test<T: Decodable>() throws -> JSON<T> {
    let dataFromAPI = Data()
    return try JSONDecoder().decode(JSON<T>.self, from: dataFromAPI)
}

// 调用示例:通过变量类型推断T为Object
do {
    let objectModel: JSON<Object> = try test()
    // 使用objectModel做后续操作
} catch {
    print(error)
}

这样调用时不需要额外传参数,Swift会根据你声明的变量类型自动推断出泛型T的具体类型。

内容的提问来源于stack exchange,提问作者Leandro P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:33:53