我有一个类似的协议:
protocol ModelProtocol{
func parse<T.Model>(data: Data) -> Array<T>? {}
}
返回是一组选项值。该方法接收数据,对其进行解析,然后从API数据返回解析对象的数组。
API返回的数据类型称为MyData
,它具有一个数组作为字典的值。
我像这样解析JSON
func parse<T>(data: Data) -> Array<T>? {
do {
let newJSONDecoder = JSONDecoder()
let menu = try newJSONDecoder.decode(MyData.self, from:data)
let dataArray = menu.data //array
let modelArray = Array<T>()
for object in dataArray {
modelArray.append(object)
}
return modelArray
}
catch {
print("error while parsing:\(error.localizedDescription)")
return nil
}
}
在追加到要返回的数组的那一行上出现错误。
无法使用类型为((MyData.Drinks)''的参数列表调用'append'
最终,我希望返回的数组具有数组MyData.data
中的类型的对象-在这种情况下,类型为Drinks
。但更广泛地说,我希望该方法返回任何JSON负载中的任何类型。目的是创建一种方法,该方法可以接收任何数据并以数组中X类型的已解析对象的形式返回任何对象。
我该怎么做?
答案 0 :(得分:1)
首先,代码无法编译:
协议方法不得包含正文
所以您必须删除括号:
protocol ModelProtocol{
func parse<T : Decodable>(data: Data) -> Array<T>?
}
要解决您的问题,请同样创建通用的MyData
struct MyData<T : Decodable> : Decodable {
let data : [T]?
}
并声明parse
func parse<T : Decodable>(data: Data) -> Array<T>? {
do {
let newJSONDecoder = JSONDecoder()
let menu = try newJSONDecoder.decode(MyData<T>.self, from:data)
return menu.data
}
catch {
print("error while parsing: ", error)
return nil
}
}
print
总是整个error
,以获取有关解码错误的详细信息。 localizedDescription
太宽。
如果预计data
是非可选的,请制作parse
throw
并移交解码错误
protocol ModelProtocol{
func parse<T : Decodable>(data: Data) throws -> Array<T>
}
struct MyData<T : Decodable> : Decodable {
let data : [T]
}
func parse<T : Decodable>(data: Data) throws -> Array<T> {
let newJSONDecoder = JSONDecoder()
let menu = try newJSONDecoder.decode(MyData<T>.self, from:data)
return menu.data
}