我想要将通用类型,即..T.Type类型转换为确认为Codable协议的类型,并将其作为参数提供给其他函数(仅将类型确认为可编码协议。)
这是我试过的代码。
我有一个泛型函数,它将JSON数据转换为Type T的模型对象,如下所示:
extension JSONDecoder {
static func convertResponse<T: Decodable>(_ response: Data, ofType: T.Type) -> T? {
let jsonDecoder = JSONDecoder()
var convertedModel:T?
do {
convertedModel = try jsonDecoder.decode(T.self, from: response)
} catch DecodingError.keyNotFound(let key, let context) {
print("Json to model conversion error \(key) \(context)")
} catch DecodingError.valueNotFound(let type, let context) {
print("Json to model conversion error \(type) \(context)")
} catch DecodingError.typeMismatch(let type, let context) {
print("Json to model conversion error \(type) \(context)")
} catch DecodingError.dataCorrupted(let context) {
print("Json to model conversion error \(context)")
} catch {
print("There is some other error ")
}
return convertedModel
}
}
我还有其他函数可以调用上面的函数..这样可以正常工作,因为它确认了Codable
// When we call this function we need to pass param Type whcih confirms to Codabel protocol.
// However I don't want that way..
func someFunction<T: Codable>(convertTo type: T.Type) {
let data = Data()
JSONDecoder.convertResponse(data, ofType: type)
}
我想在上面的函数中删除Codable一致性,如下所示。然而,这给了我编译错误或者我可能以错误的方式做了
func functionWithoutProtocolConform<T>(convertTo type: T.Type) {
let data = Data() // for eg...
if type is Decodable.Type {
let decodableType = type as! Decodable.Type
JSONDecoder.convertResponse(data, ofType: decodableType) // !!!! Error here
}
else {
// do something else....
}
}
请你建议一种方法来做这件事。