创建通用Alamofire服务的问题



嗨,我试图创建自己的通用服务,但我做不到。在我第一次尝试使用这段代码时,我无法将值设置为t。当我删除值的强制转换为t时,Xcode说你应该强制转换它,但当我运行应用程序时,它会崩溃,因为它失败了。

@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!)
}
}
}


}

我的第二次尝试得到了可解码的响应,但Xcode给了我错误:协议类型"可解码"的值不能符合"可解码的";只有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!)
}
}
}


}

您之所以出现此错误,是因为您使用的方法没有指定响应需要转换为的Codable类型。若要解决此问题,请创建一个Codable结构,然后将期望的变量声明为该特定类型,以便编译器可以推断出将数据解码为哪种类型。

struct TestModel: Codable {
// all the properties...
}
let testObject: Promise<[TestModel]> = requestTwo(fullUrl: <#T##String#>, method: <#T##<<error type>>#>, parameters: <#T##<<error type>>#>)

刚刚发现一个解决方案问题是TestModel是可编码的,但当我改为可解码时,所有问题都解决了

最新更新