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



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

NetworkingManager
NetworkRequest

我的目标是让请求保持其CodableType以便在网络完成时,Manager层可以使用正确的类型实例化新实例

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

所以我的NetworkRequest看起来像这样

class NetworkRequest {
var objectClass:Codable.Type
}

假设我有一个符合CodablePerson

class Person : Codable {
var name:String?
}

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

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

现在,当我希望NetworkingManager解码响应时,我像这样使用它:

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

问题是当我这样做时,我收到此错误:

无法使用类型(Decodable.Type,from:Data(的参数列表调用解码。需要类型(T.Type,来自:数据(的参数列表。

任何帮助将不胜感激

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)
}

尝试这样的事情:

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
}

然后发起并调用喜欢

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

和呼叫

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

相关内容

  • 没有找到相关文章

最新更新