如何将通用类型(T.Type)转换为确认任何协议的特定类型(在本例中为可编码协议)

时间:2017-11-15 09:53:02

标签: json swift

我想要将通用类型,即..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....
    }
}

请你建议一种方法来做这件事。

0 个答案:

没有答案