我正在研究一个处理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)
}