无法将“Codable”(也称为“Decodable&Encodable”)类型的值转换为所需的参数类型'T.Type'

我正在研究一个处理JSON解析的小结构。到目前为止,它都正常工作,除了我想传递一个自定义结构作为一个结构用于JSONDecoder().decode(type.self, from: data)中的解码,但这引发了以下错误:
无法将“Codable”(也称为“Decodable&Encodable”)类型的值转换为所需的参数类型'T.Type'

private func parseJson(data: Data, type: Codable) -> Codable? {
    do {
        let decoded = try JSONDecoder().decode(type.self, from: data) 
        return decoded
    } catch {
        print("JSON decode error: \(error.localizedDescription)")
    }
    return nil
}

解决方法

private func parseJson<T: Decodable>(data: Data, type: T.Type) -> T? {
    do {
        return try JSONDecoder().decode(type.self, from: data)
    } catch {
        print("JSON decode error:", error)
        return nil
    }
}

也可以省略类型并显式设置结果对象的类型:

private func parseJson<T: Decodable>(data: Data) -> T? {
    do {
        return try JSONDecoder().decode(T.self, from: data)
    } catch {
        print("JSON decode error:", error)
        return nil
    }
}

Playground testing:

struct User: Codable {
    let id: Int
    let name: String
}
let user: User = .init(id: 2, name: "abc")
let userData = try! JSONEncoder().encode(user)

let decodedUser: User = parseJson(data: userData)!
decodedUser.name  // "abc"

注意:我返回的是可选类型,但您一定要让您的方法抛出并返回一个非可选的类型,如下所示:

extension Data {
    func decodedObject<T: Decodable>() throws -> T {
        try JSONDecoder().decode(T.self, from: self)
    }
}
do {
    let decodedUser: User = try userData.decodedObject()
    print(decodedUser.name)  // "abc"
} catch {
    print(error)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。