Привет, Hds Вы правильно выполнили большую часть работы, только один упущенный момент - это знание о том, как работают Decodables.
Массив Decodable также Decodable.Итак, я пытаюсь сказать, что вам не нужно явно упоминать, что вы хотите декодировать Array<T>.self
, вы можете поместить T.self, если вы перешли к функции, которую вы ожидаете Array<T>.self
, такT => Array<T>
Так что в вашем случае, когда вы вызываете эту функцию и передаете [User]
в качестве универсального параметра, T
будет Array<User>.self
при декодировании.Вот как должен выглядеть код.Я не уверен, что код будет компилироваться на 100%, потому что у меня есть некоторые недостающие компоненты, но это помогает понять.
func get<T:Deocdable>(completion: @escaping (_ object: T?,_ error: String?) -> ()) {
router.request(.getUsers) { (data, response, error) in
do {
let object = try JSONDecoder().decode(T.self, from: responseData)
} catch {
fatalError("Decoding failed because: ", error.localizedDescription)
}
}
Также я добавил блок do catch, потому что try JSONDecoder()
throws.
Кроме того, чтобы добавить, как вы должны вызывать метод, он выглядит следующим образом:
get { (users: [User]?, error) in
}
Надеюсь, это поможет.