我正在尝试建立一个系统,我的所有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>)
并且错误将会消失。
我的问题是如何解决这个错误,使其完全通用
答案 0 :(得分:2)
错误处理程序和成功处理程序具有相同的类型 T:Mappable 是没有意义的。您只会在成功处理程序中获取映射对象。错误处理程序应该类似于(错误) - &gt; ()强>
其次,关于闭包参数的参数类型,您的函数是通用的,但是在调用函数时,您没有指定类型:
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
})