Универсальное сетевое декодирование с Codable & JSONParser - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть две основные части в инфраструктуре моего приложения.

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
}

Допустим, у меня есть класс Person, который соответствуетCodable

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, from: Data).

любая помощь будет оценена

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Делает ли маркировка 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)
0 голосов
/ 12 сентября 2018
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)
}
0 голосов
/ 12 сентября 2018

Попробуйте что-то вроде этого:

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

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