繁体   English   中英

无法将“Codable”(又名“Decodable & Encodable”)类型的值转换为预期的参数类型“T.Type”

[英]Cannot convert value of type 'Codable' (aka 'Decodable & Encodable') to expected argument type 'T.Type'

我正在研究一个处理 JSON 解析的小结构。 到目前为止,除了我想将自定义结构作为结构传递给JSONDecoder().decode(type.self, from: data)它都在工作, 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
}

有没有办法可以将结构传递到此方法中以用作decode()函数的类型? 如果我直接设置我试图传递到 decode() 函数上的函数的类型,则代码按预期工作,只有在我尝试传递它时才会出错。

你需要的是一个通用的方法:

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
    }
}

游乐场测试:

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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM