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

Generic networking decoding with Codable & JSONParser

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

NetworkingManager
NetworkRequest

我的目标是让请求保持其 Codable Type 因此当网络完成时 Manager 层可以使用 [=23= 实例化具有正确类型的新实例]

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

所以我的 NetworkRequest 看起来像这样

class NetworkRequest {
  var objectClass:Codable.Type
}

假设我有一个 Person class 符合 Codable

class Person : Codable {
 var name:String?
}

现在我需要像这样将类型分配到请求中(以一种丑陋的方式到达这里)

let request = NetworkingRequest()
request.objectClass = Person.self

现在,当我想要 NetworkingManager 解码响应时,我会这样使用它:

JSONDecoder().decode(type:request.objectClass, data:dataFromService)

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

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

任何帮助将不胜感激

尝试这样的事情:

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

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

NetworkRequest 标记为通用 <T: Codeable> 是否符合您的需要?

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

然后初始化调用like

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

并打电话

try JSONDecoder().decode(request.objectClass, from: dataFromService)
class NetworkRequest<T: Codable> {
    var objectClass: T.Type!

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

}

class Person : Codable {
    var name:String?
}

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

let response : Dictionary<String,Any> = ["name":"test"]
let data : Data = try! JSONSerialization.data(withJSONObject: response,options: [])

do {
    let person = try JSONDecoder().decode(request.objectClass, from: data)
    print(person.name ?? "--")
} catch {
    print(error)
}