无法将类型 '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)
中的解码器使用,但这会引发以下错误:
Cannot convert value of type 'Codable' (aka 'Decodable & Encodable') to expected argument type '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"
注意:我正在 returning 可选类型,但你绝对应该让你的方法抛出并且 return 是非可选的,你可以在下面看到我扩展数据的地方:
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)
}
我正在开发一个小型结构来处理 JSON 的解析。到目前为止,一切正常,除了我想将自定义结构作为结构传递给 JSONDecoder().decode(type.self, from: data)
中的解码器使用,但这会引发以下错误:
Cannot convert value of type 'Codable' (aka 'Decodable & Encodable') to expected argument type '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"
注意:我正在 returning 可选类型,但你绝对应该让你的方法抛出并且 return 是非可选的,你可以在下面看到我扩展数据的地方:
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)
}