#ios #swift #api #generics
Вопрос:
Я пытаюсь получить различные модели и преобразовать их в кодируемые во время вызова API, вот что я пробовал
Он показывает ошибку типа ‘FetchAPI’ не соответствует протоколу ‘Encodable’ если я удалить [т. тип] и принимаем только [Т] его не показывает никаких ошибок, но во время ответа произошла ошибка и ответ не может быть декодирован из-за ошибки: данные не могли быть прочитаны, потому что это не в правильном формате
—-> Модели
struct FetchAPI<T:Codable>:Codable {
var Flag:Int?
var msg:String?
var status:Int?
var data:[T.Type]?
enum CodingKeys: String, CodingKey {
case Flag = "Flag"
case status = "StatusCode"
case msg = "Message"
case data = "Data"
}
static func getProjects() {
MyApiManager.shared.getAPICallDecodable(url: ServerAPI.getProjects, objectType: FetchAPI<Projects>.self, success: {
response in
print(response)
}, failure: { error in
print(error)
})
}
}
—> Модель проекта
struct Projects: Codable {
var projectID: Int?
var projectName, phoneNumber, location: String?
var noOfParts: Int?
enum CodingKeys: String, CodingKey {
case projectID = "ProjectId"
case projectName = "ProjectName"
case phoneNumber = "PhoneNumber"
case location = "Location"
case noOfParts = "No_Of_Parts"
}
}
—> APIManager
func getAPICallDecodable<T:Codable> (url:String,objectType:T.Type,success: @escaping (_ responseObject:T)->Void,failure: @escaping (_ error:String) -> Void , method:HTTPMethod = .get) {
if(Utilities.isConnectedToNetwork()) {
guard let urlIs = URL(string: url) else {
failure(ServerAPI.errorMessages.kServerDownError)
return
}
Utilities.printLog(urlIs)
Utilities.printLog("(LogLevel.Info) (headers)")
AF.request(url,method:method,headers: self.headers).responseDecodable(of: objectType) { respons in
print(type(of: objectType))
switch respons.result {
case .success(let data):
success(data)
Loader.hide()
print("data")
case .failure(let error):
failure(error.localizedDescription)
}
}
}
}
заранее спасибо
Комментарии:
1.
The data couldn’t be read because it isn’t in the correct format
, хорошо покажите нам формат ваших данных (и пример), чтобы мы могли отследить источник ошибки.2.
failure(error.localizedDescription)
: Печатайтеerror
раньше, потомуerror.localizedDescription
что это больше для пользователя, чем для разработчика… Кроме того, где именно вы предприняли свою попытку с сообщением об ошибке? Вы хотели использовать вместо этого?objectType: [FetchAPI<Projects>].self
3. @workingdog спасибо тебе … Я просто совершал глупую ошибку, неправильно записывая ключи…. в кодовом ключе была орфографическая ошибка