编写一个用于解码通用JSON的函数。如何为Codable.Protocol给出参数?

时间:2019-05-09 18:29:23

标签: json swift codable

我正在尝试编写我的第一个认真的Xcode项目,而我对Swift 5的了解还不多。因此,我什至不确定所想到的是否足够有意义。

我手头的项目涉及许多JSON文件的获取和解码。响应有两种或三种模式。因此,我认为我会写一个func并将其响应模式传递给它。

我使用decode<T>(_ type: T.Type, from data: Data): JSONDecoder解码我的数据。该函数的第一个参数显然具有类型T.Type。但实际上它应该是Codable.Protocol类型。

有没有办法让我Codable得到它?

这是我的功能:

func requestPageContent(forCodable codable: Codable, completion: @escaping (Result<PageContent, Error>) -> Void) {
    DispatchQueue.global(qos: .default).async {
        if let jsonData = try? Data(contentsOf: self) {
            if let requestResults = try? JSONDecoder().decode(type(of: codable).self, from: jsonData) {
                DispatchQueue.main.async {
                    completion(.success(requestResults))
                }
            } else {
                print("error: json decoder")
            }
        } else {
            print("error: fetch data")
        }
    }
}

谢谢。

1 个答案:

答案 0 :(得分:1)

您是说requestPageContent是通用的,像这样:

func requestPageContent<Content: Codable>(forCodable codable: Content, 
                                          completion: @escaping (Result<Content, Error>) -> Void) {

    ...
    if let requestResults = try? JSONDecoder().decode(Content.self, from: jsonData) {
    ...

这表示您正在请求某些在编译时已知的特定于 内容类型。