Проблема с созданием Generi c сервиса Alamofire - PullRequest
0 голосов
/ 06 августа 2020

Привет, я пытаюсь создать свой собственный общий c сервис, но не смог. В моей первой попытке в этом коде я не могу получить значение T. Когда я удаляю преобразование в T для значения, Xcode говорит, что вы должны преобразовать его, но когда я запускаю приложение, это cra sh, потому что оно не работает.

  @discardableResult
    public func request<T:Codable>(fullUrl url: String,method: HTTPMethod, parameters: Parameters?) -> Promise<T> {
        
        //Add Loading Action
        return Promise<T> { seal in
            sessionManager!.request(url, method: method, parameters: parameters, headers: headers())
                .validate(statusCode: 200..<300)
                .responseJSON { response in// Edit, response as your custom model (response: DataResponse<T,AFError>)
                    
                    if response.data != nil {
                        switch response.result {
                        //Add Loading Action
                        case .success(let value):
                            print("ferhan \(value)")
                            seal.fulfill(value as! T)
                        case .failure(let error):
                            guard let data = response.data else {return}
                            guard let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {return}
                            
                            if let code = response.response?.statusCode {
                                switch code {
                                case 400..<599, 0:
                                    if let code = json["errorCode"] as? Int{
                                        print(code)
                                    }
                                    if let title = json["message"] as? String{
                                        print(title)
                                    }
                                default:
                                    print("Unexpected status")
                                }
                            }
                            //Add Loading Action
                            seal.reject(error)
                        }
                    } else {
                        print("response nil non value \(String(describing: response.error?.localizedDescription))")
                        //Add Loading Action
                        seal.reject(response.error!)
                    }
                }
        }
        
        
    }

При второй попытке я получаю ответ как Decodable, но Xcode выдает ошибку: значение типа протокола «Decodable» не может соответствовать «Decodable»; только типы struct / enum / class могут соответствовать протоколам.

Мой вопрос в том, какое решение лучше и как его решить, чем проблемы.

    @discardableResult
    public func requestTwo<T:Codable>(fullUrl url: String,method: HTTPMethod, parameters: Parameters?) -> Promise<T> {
        
        //Add Loading Action
        
        return Promise<T> { seal in
            sessionManager!.request(url, method: method, parameters: parameters, headers: headers())
                .validate(statusCode: 200..<300)
                .responseDecodable { (response: DataResponse<T, AFError>) in
                    if response.data != nil {
                        switch response.result {
                        //Add Loading Action
                        case .success(let value):
                            print("ferhan \(value)")
                            seal.fulfill(value)
                        case .failure(let error):
                            guard let data = response.data else {return}
                            guard let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {return}
                            
                            if let code = response.response?.statusCode {
                                switch code {
                                case 400..<599, 0:
                                    if let code = json["errorCode"] as? Int{
                                        print(code)
                                    }
                                    if let title = json["message"] as? String{
                                        print(title)
                                    }
                                default:
                                    print("Unexpected status")
                                }
                            }
                            //Add Loading Action
                            seal.reject(error)
                        }
                    } else {
                        print("response nil non value \(String(describing: response.error?.localizedDescription))")
                        //Add Loading Action
                        seal.reject(response.error!)
                    }
                }
        }
        
        
    }

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Только что обнаружил проблему решения: TestModel был Codable, но когда я перешел на Decodable, вся проблема решена

0 голосов
/ 06 августа 2020

Вы получаете эту ошибку, потому что вы используете метод без указания типа Codable, в который необходимо преобразовать ответ. Чтобы устранить проблему, создайте структуру Codable, а затем объявите ожидаемую переменную как этот конкретный тип, чтобы компилятор мог сделать вывод, в какой тип декодировать данные.

struct TestModel: Codable {
    // all the properties...
}

let testObject: Promise<[TestModel]> = requestTwo(fullUrl: <#T##String#>, method: <#T##<<error type>>#>, parameters: <#T##<<error type>>#>)
...