[英]Generic networking decoding with Codable & JSONParser
我的應用程序基礎結構中有2個主要部分。
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
}
可以說我有一個符合Codable
的Person
類
class Person : Codable {
var name:String?
}
現在我需要像這樣將類型分配給請求(以一種丑陋的方式來說明這一點)
let request = NetworkingRequest()
request.objectClass = Person.self
現在,當我希望NetworkingManager
解碼響應時,我將其像這樣使用:
JSONDecoder().decode(type:request.objectClass, data:dataFromService)
問題是當我這樣做時出現此錯誤:
無法使用類型為(Decodable.Type,來自:Data)的參數列表調用解碼。 預期類型為(T.Type,來自:數據)的參數列表。
任何幫助,將不勝感激
嘗試這樣的事情:
class NetworkRequest<T: Codable> {
var objectClass: T.Type
init(objectClass: T.Type) {
self.objectClass = objectClass
}
}
將NetworkRequest
標記為通用<T: Codeable>
是否<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)
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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.