簡體   English   中英

使用Codable和JSONParser進行通用網絡解碼

[英]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
}

可以說我有一個符合CodablePerson

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM