【问题标题】:AlamofireObjectMapper Generic parameter 'T' could not be inferred无法推断 AlamofireObjectMapper 通用参数“T”
【发布时间】:2018-05-19 12:47:24
【问题描述】:

我正在尝试建立一个系统,其中我的所有 api 请求都通过一个函数路径并将它们映射到相应的对象

func sendApi<T>(url : String , httpMethod : HTTPMethod = .get,
                 parameters: Parameters? = nil,
                 encoding: ParameterEncoding = URLEncoding.default,
                 headers: HTTPHeaders? = nil , callbackSuccess : @escaping (T) -> () , callbackFailure : @escaping (T) -> ()) where T : Mappable {

    Alamofire.request(url, method: httpMethod, parameters: parameters , encoding: encoding, headers: headers).responseObject{(response: (DataResponse<T>))in

            switch response.result {

            case .success :
                let result  = Mapper<T>().map(JSONObject: response.value)!
                callbackSuccess(result)
                break;
            case .failure(let error):
                if((error as NSError).code == ErrorResponse.noInternetConnection){
                    //  errorCallBack(ErrorResponse.noInternetConnectionString)
                }
                // errorCallBack(error.localizedDescription)
                print(error.localizedDescription)
                break;
            }
    }
}

但是当我尝试在 get 方法中调用函数时,例如

 func testApiGet(url: String , packageId : Int ,callback :@escaping (myObject) -> Void , errorCallBack : @escaping (String) -> Void ){

        let token = spm.getUserToken()
        let headers = ["X-Auth-Token" : token]
        let newUrl = url + "?packageId=" + String(packageId)

        sendApi(url: url, httpMethod: HTTPMethod.get , parameters: nil, encoding: JSONEncoding.default, headers: headers, callbackSuccess: {(jsonObject) in

        } , callbackFailure:{ (jsonObject)in

        })        
    }

我收到错误“无法推断通用参数'T'”

当然我可以设置对象的类型

(response: (DataResponse<myObject>)

错误就会消失。

我的问题是如何解决这个错误以使其完全通用

【问题讨论】:

    标签: ios swift generics alamofire objectmapper


    【解决方案1】:

    错误处理程序和成功处理程序具有相同类型 T: Mappable 是没有意义的。您只会在成功处理程序中获得一个映射对象。错误处理程序应该类似于 (Error) -> ()

    其次,就闭包参数的参数类型而言,您的函数是通用的,但是当您调用该函数时,您并没有指定类型:

     sendApi(url: url, httpMethod: HTTPMethod.get , parameters: nil, encoding: JSONEncoding.default, headers: headers, callbackSuccess: {(jsonObject) in
    
            } , callbackFailure:{ (jsonObject)in
    
            })  
    

    因此,编译器不知道您期望的是什么类型,这就是为什么它抱怨它无法在此处推断类型的原因。您需要显式提供参数类型,因为它决定了调用哪个泛型版本:

     sendApi(url: url, httpMethod: HTTPMethod.get , parameters: nil, encoding: JSONEncoding.default, headers: headers, callbackSuccess: {(jsonObject: MyMappableType) in
    
            } , callbackFailure:{ (error: Error)in
    
            }) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多