Привет, я пытаюсь создать свой собственный общий 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!)
}
}
}
}