Тип «FetchAPI» не соответствует протоколу «Декодируемый/кодируемый» при использовании универсального типа

#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 спасибо тебе … Я просто совершал глупую ошибку, неправильно записывая ключи…. в кодовом ключе была орфографическая ошибка