【发布时间】:2020-11-27 02:16:48
【问题描述】:
您好,我正在尝试创建自己的通用服务,但我做不到。在我第一次尝试此代码时,我无法将 value 作为 T。当我删除 cast as T for value 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!)
}
}
}
}
【问题讨论】:
-
你是怎么调用这个方法的?
-
func getData() -> Promise { service.get(url: "/cmets", parameters: ["postId": 1]) } 还有很多代码
标签: swift xcode request alamofire