0

我正在使用 Alamofire 获取数据。URLRequestConvertible 协议用于构造请求。当通过 Alamofire 在请求的类函数中调用 URLRequestConvertible 枚举时,我收到一个错误,例如(来自类型'(AFDataResponse)的抛出函数的无效转换抛出-> Void' (aka '(DataResponse<Any, AFError>) throws -> ()') 到非抛出函数类型 '(AFDataResponse) -> Void' (aka '(DataResponse<Any, AFError>) -> ( )'))。在我获取结果的请求函数中,我如何使用泛型?Q1:获取结果时出错 Q2:如何在函数中使用泛型

URLRequestConvertible 枚举:

enum Router: URLRequestConvertible{
    case getAllDishes
    var bseUrl : URL{
        return URL(string: "https://yummie.glitch.me/")!
    }
    var method: HTTPMethod{
        switch self {
        default:
            return .get
        }
    }
    var path:String{
        switch self{
        case .getAllDishes:
            return "dish-categories"
        }
    }
    func asURLRequest() throws -> URLRequest {
        let url = bseUrl.appendingPathComponent(path)
        var request =  URLRequest(url: url)
        request.method = method
        return request
    }
}

调用请求的函数:

class NetworkLayer{
    class func requested(_ request:Router,completion:@escaping(Result<Data,Error>) -> Void){
        ProgressHUD.show() //if response comes that loader run
        AF.request(request).responseJSON{ (response) in
            switch response.result{
                case .success(let data):
                    do{
                        let getDishesData = data as? [String:Any]
                        let resp = try JSONSerialization.data(withJSONObject: getDishesData?["data"], options: .prettyPrinted)
                        completion(.success(response))
                    }
                case .failure(let error):
                    completion(.failure(error))
            }
    }
    }

在此处输入图像描述

4

1 回答 1

0

您需要添加 Do-Catch 语句

catch - 如果抛出方法失败并引发错误,则执行将落入此 catch 块。

class NetworkLayer{
    class func requested(_ request:Router,completion:@escaping(Result<Data,Error>) -> Void){
        ProgressHUD.show() //if response comes that loader run
        AF.request(request).responseJSON{ (response) in
            switch response.result{
            case .success(let data):
                do{
                    let getDishesData = data as? [String:Any]
                    let resp = try JSONSerialization.data(withJSONObject: getDishesData?["data"], options: .prettyPrinted)
                    completion(.success(response))
                }catch{
                    print(error)
                    completion(.failure(error))
                }
            case .failure(let error):
                completion(.failure(error))
            }
        }
    }
}

这里给你的另一个建议是不需要做 JSONSerialization,因为 responseJSON 会给你直接的响应(Alamofire 会做 JSONSerialization)。

最终代码

class NetworkLayer{
    class func requested(_ request:Router,completion:@escaping(Result<Data,Error>) -> Void){
        ProgressHUD.show() //if response comes that loader run
        AF.request(request).responseJSON{ (response) in
            switch response.result{
            case .success(let response):
                do{
                    print(response)
                    completion(.success(response))
                }catch{
                    print(error)
                    completion(.failure(error))
                }
            case .failure(let error):
                completion(.failure(error))
            }
        }
    }
}
于 2021-10-13T15:38:03.037 回答