Swift 尝试编写一个通用函数,用于将JSON解析为可编码结构
我目前正在像这样解析JSONSwift 尝试编写一个通用函数,用于将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
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)
}