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
相关产品推荐
相关产品推荐

