【问题标题】:Issue Creating Generic Alamofire Service创建通用 Alamofire 服务的问题
【发布时间】: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


【解决方案1】:

您收到此错误是因为您在使用该方法时未指定需要将响应转换为的 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 是 Codable 但是当我更改为 Decodable 时,所有问题都解决了
  • 没有意义Codable = Decodable &amp; Encodable
【解决方案2】:

刚刚发现一个解决方案问题是 TestModel 是 Codable 但是当我更改为 Decodable 时,所有问题都解决了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多