使用Codable和JSONParser进行通用网络解码

时间:2018-09-12 06:05:22

标签: ios swift generics codable jsondecoder

我的应用程序基础结构中有两个主要部分。

NetworkingManager
NetworkRequest

我的目标是让请求保留其Codable Type,以便在完成网络连接后Manager层可以使用

实例化具有正确类型的新实例。

decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable

所以我的NetworkRequest看起来像这样

class NetworkRequest {
  var objectClass:Codable.Type
}

让我说我有一个符合Person的{​​{1}}类

Codable

现在我需要像这样将类型分配给请求(以一种丑陋的方式来说明问题)

class Person : Codable {
 var name:String?
}

现在,当我希望let request = NetworkingRequest() request.objectClass = Person.self 解码响应时,我会像这样使用它:

NetworkingManager

问题是当我这样做时出现此错误:

无法使用类型为(Decodable.Type,来自:数据)的参数列表调用解码。预期类型为(T.Type,来自:数据)的参数列表。

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

尝试这样的事情:

class NetworkRequest<T: Codable> {
    var objectClass: T.Type

    init(objectClass: T.Type) {
        self.objectClass = objectClass
    }
}

答案 1 :(得分:1)

NetworkRequest标记为通用<T: Codeable>可以满足您的需求吗?

class NetworkRequest<T: Codable> {
    var objectClass: T.Type
}

然后像这样初始化和调用

let request = NetworkRequest<Person>()
request.objectClass = Person.self

然后打电话

try JSONDecoder().decode(request.objectClass, from: dataFromService)

答案 2 :(得分:1)

function deletePlaylist(songid) { 
    var currentModal = $(this);
    currentModal.find('.btn-ok').click(function() {
        console.log(songid);
    });
}