无法调用非函数类型的值'NSHTTPURLResponse?' Alamofire ObjectMapper

时间:2015-10-04 11:02:47

标签: swift swift2 alamofire

无法调用非函数类型的值'NSHTTPURLResponse?'enter image description here

有人可以帮我吗?

这是代码

   public func responseObject<T: Mappable>(queue: dispatch_queue_t?, keyPath: String?, completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, AnyObject?, ErrorType?) -> Void) -> Self {

    return response(queue: queue, responseSerializer: Request.JSONResponseSerializer(options: NSJSONReadingOptions.AllowFragments)) { request, response, result in
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
            let parsedObject = Mapper<T>().map(keyPath != nil ? result.value?[keyPath!] : result.value)

            dispatch_async(queue ?? dispatch_get_main_queue()) {
                completionHandler(self.request!, self.response, parsedObject, result.value ?? result.data, result.error)
            }
        }
    }
}

我的不好,我没注意到Alamofire 2.0的返回类型,

这是固定的,更新的代码在这里

public func responseObject<T: Mappable>(queue: dispatch_queue_t?, keyPath: String?, completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, AnyObject?, ErrorType?) -> Void) -> Self {

let serializer = Request.JSONResponseSerializer(options: NSJSONReadingOptions.AllowFragments)

return response(queue: queue, responseSerializer: serializer) { (Response) -> Void in

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
            let parsedObject = Mapper<T>().map(keyPath != nil ? Response.result.value?[keyPath!] : Response.result.value)



            dispatch_async(queue ?? dispatch_get_main_queue()) {
                completionHandler(self.request!, self.response, parsedObject, Response.result.value ?? Response.result.value, Response.result.error)
            }
        }

    }
}

2 个答案:

答案 0 :(得分:3)

我自己犯了这个错误并花了一段时间才弄清楚它为什么会发生。看起来如果response()方法调用的参数与任何方法声明都不匹配,那么swift假定您的代码引用response属性NSHTTPURLResponse。因为有“阴影”方法名称的属性,swift无法帮助你解决指出哪个参数有问题的错误,它只是在匹配任何方法时都会出现问题。

就我而言,由于 参数,completionHandler不匹配。请注意,我看到的示例代码.response { response in ... }存在问题。没有response方法采用“响应”关闭,就像responseStringresponseJSON等方法一样。

那就是说Abh,我无法看出你的代码究竟是什么问题。

答案 1 :(得分:0)

您需要将completionHandler标记为@escaping。