【发布时间】:2019-01-31 14:59:02
【问题描述】:
我有一个格式为
的 json 响应ServerResponse -> ResponseData -> 数据数组
struct ServerResponse<T: Codable>: Codable {
let methodName: String
let responseCode: Int
let responseMessage: String
let responseData: ResponseData<T>
enum CodingKeys: String, CodingKey {
case methodName = "methodName"
case responseCode = "responseCode"
case responseMessage = "responseMessage"
case responseData = "ResponseData"
}
}
struct ResponseData<T: Codable>: Codable {
let order: Int
let data: [T]
enum CodingKeys: String, CodingKey {
case order = "order"
case data = "dataArray"
}
}
struct Post: Codable {}
struct Comment: Codable {}
struct Comment: Codable {}
在我的响应中,数据可以是任何类型的可编码类数组,如 Post 、 comment 、 Users 等。
我创建了一些通用方法来解析响应
func fetchGenericData2<T: Codable>(data: Data, completion: @escaping (T) -> ()) {
self.fetchGenericData(data: data, completion: { (result:ServerResponse<T>) in
print(result.responseData.data[0])
// completion([result.responseData.data])
})
}
func fetchGenericData<T: Codable>(data: Data, completion: @escaping (T) -> ()) {
do {
let responseObject = try JSONDecoder().decode(T.self, from: data)
print(responseObject)
completion(responseObject)
} catch {
print(error.localizedDescription)
}
}
我通过传递我需要的可编码类来调用该方法
self.fetchGenericData2(data: data, completion: { (response:[User]) in
print(response)
})
目前我的通用模型没有到达最终方法,所以它不知道它是什么类。
如果我直接发送最终模型,它可以正常工作,如下所示:
self.fetchGenericData(data: data, completion: { (response:ServerResponse<User>) in
print(response.responseData.data)
})
但在这种情况下,我必须发送未抽象的 ServerResponse 类。
我如何格式化我的方法,这样我只需要使用我的最终模型名称调用一个方法,然后我就可以直接获取模型数组,例如:像这样:
self.fetchGenericData(data: data, completion: { (response:[User]) in
print(response)
})
【问题讨论】:
标签: ios swift iphone generics closures