使用 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)
}
我的应用程序基础结构中有 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)
}