Swift 尝试编写一个通用函数,用于将JSON解析为可编码结构

Swift 尝试编写一个通用函数,用于将JSON解析为可编码结构,swift,generics,codable,Swift,Generics,Codable,我目前正在像这样解析JSON struct ExampleStruct : Codable { init() { } // implementation } if let jsonData = jsonString.data(using: .utf8) { do { let decoder = JSONDecoder() let object = try decoder.decode(ExampleStruct.self

我目前正在像这样解析JSON

struct ExampleStruct : Codable {
     init() {

     }
     // implementation
}

if let jsonData = jsonString.data(using: .utf8) {
    do {
        let decoder = JSONDecoder()
        let object =  try decoder.decode(ExampleStruct.self, from: jsonData)
    } catch {
        print("Coding error - \(error)")
    }
}
这很好,不过我周末一直在努力学习泛型。我试图编写一个方法,传入一个可编码的结构类型和一个JSON字符串,返回我想要返回的对象类型

我尝试了以下方法:-

func getType<T>(_ anyType: T.Type, from jsonString:String) -> T? {

if let jsonData = jsonString.data(using: .utf8) {
    do {
        let decoder = JSONDecoder()
        let object =  try decoder.decode(anyType, from: jsonData)//Errors here
        return object as? T
        return nil
    } catch {
        print("Coding error - \(error)")
       return nil
    }
  }
return nil
}
然而,在let=object行上,我得到了以下错误

无法将类型“T”(全局函数“getType(:from:)”的泛型参数)的值转换为预期的参数类型“T”(实例方法“decode(:from:)”的泛型参数)

在参数类型“T.type”中,“T”不符合预期的类型“Decodable”


正如我所说,这个周末我一直在努力学习泛型,但我的理解显然遇到了障碍。有没有一个解决方案,这确实是我想做的,甚至是可能的,或者是一个好主意?

首先强烈建议将
throw
ing函数的错误交给调用者。
其次,从UTF8字符串创建的数据永远不会失败

您必须将泛型类型约束为
可解码的
,不需要将类型作为额外参数传递

您的功能可以简化为

func getType<T : Decodable>(from jsonString:String) throws -> T {
    let jsonData = Data(jsonString.utf8)
    return try JSONDecoder().decode(T.self, from: jsonData)
}
func getType(来自jsonString:String)抛出->T{
让jsonData=Data(jsonString.utf8)
返回try JSONDecoder().decode(T.self,from:jsonData)
}

首先,强烈建议将
抛出
ing函数的错误移交给调用者。
其次,从UTF8字符串创建的数据永远不会失败

您必须将泛型类型约束为
可解码的
,不需要将类型作为额外参数传递

您的功能可以简化为

func getType<T : Decodable>(from jsonString:String) throws -> T {
    let jsonData = Data(jsonString.utf8)
    return try JSONDecoder().decode(T.self, from: jsonData)
}
func getType(来自jsonString:String)抛出->T{
让jsonData=Data(jsonString.utf8)
返回try JSONDecoder().decode(T.self,from:jsonData)
}