Swift 无法调用非函数类型的值';NSHTTPURLRResponse?&x27;阿拉莫菲尔对象映射器

Swift 无法调用非函数类型的值';NSHTTPURLRResponse?&x27;阿拉莫菲尔对象映射器,swift,swift2,alamofire,Swift,Swift2,Alamofire,无法调用非函数类型“NSHTTPURLResponse”的值 有人能帮我吗 这是密码 public func responseObject<T: Mappable>(queue: dispatch_queue_t?, keyPath: String?, completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, AnyObject?, ErrorType?) -> Void) -> Self { re

无法调用非函数类型“NSHTTPURLResponse”的值

有人能帮我吗

这是密码

   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)
            }
        }
    }
}
public func responseObject(队列:dispatch\u queue\u t?,键路径:String?,completionHandler:(NSURLRequest,NSHTTPURLResponse?,t?,AnyObject?,ErrorType?->Void)->Self{
返回响应(队列:queue,responseSerializer:Request.JSONResponseSerializer(选项:NSJSONReadingOptions.AllowFragments)){Request,response,result in
调度异步(调度获取全局队列(调度队列优先级默认为0)){
让parsedObject=Mapper().map(keyPath!=nil?result.value?[keyPath!]:result.value)
调度\异步(队列??调度\获取\主\队列(){
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)
            }
        }

    }
}
public func responseObject(队列:dispatch\u queue\u t?,键路径:String?,completionHandler:(NSURLRequest,NSHTTPURLResponse?,t?,AnyObject?,ErrorType?->Void)->Self{
让serializer=Request.JSONResponseSerializer(选项:NSJSONReadingOptions.AllowFragments)
返回响应(队列:队列,响应序列化器:序列化器){(响应)->中的Void
调度异步(调度获取全局队列(调度队列优先级默认为0)){
让parsedObject=Mapper().map(keyPath!=nil?Response.result.value?[keyPath!]:Response.result.value)
调度\异步(队列??调度\获取\主\队列(){
completionHandler(self.request!、self.response、parsedObject、response.result.value??response.result.value、response.result.error)
}
}
}
}

我自己也有这个错误,花了一段时间才弄清楚它发生的原因。如果
response()
方法调用的参数与任何方法声明都不匹配,则swift假定您的代码引用的是
response
属性,即
NSHTTPURLResponse
。由于存在“隐藏”方法名称的属性,swift无法帮助您解决指示哪个参数是问题的错误,它只是将匹配与任何方法相匹配

在我的例子中,
completionHandler
由于其参数不匹配。注意,我看到的示例代码
.response{response in…}
有问题。没有任何
response
方法像
responseString
responseJSON
等方法那样在闭包中进行“response”


也就是说,我看不出你的代码到底有什么问题。

你需要将completionHandler标记为@escaping。

我尝试使用Alamofire 2.0响应序列化程序,这也会产生同样的错误。请写下你的代码,不要发布屏幕截图。我已经添加了代码。有什么想法吗?我必须使用
responseJSON
responseData
而不是headi在我使用
响应(队列队列:dispatch\u queue\u t?=nil,completionHandler:…)->Self
方法时,将参数固定为
completionHandler
,更改
.response{response in…}
从示例代码复制到
.response{{uu,{uu,{uu,错误在…}
感谢您的回复,但我无法在此处发布我的代码,因此我问了一个新问题。看起来您可以回答,请提供帮助,如果您的回答与我使用的
response()
方法不同,那么我很乐意接受您的回答,因此我的解决方案对您没有多大帮助。如果我能想出一些一般性的建议,我会给你的新问题贴一个答案。但本质上这是同一个核心问题:因为Alamofire定义了一个
响应
属性,它阻止swift为
响应
方法显示有用的错误。我偶然发现了相同的错误消息/情况。其原因是相同的:方法签名的不匹配。但是在我的例子中,我在函数中使用了一个
try
,而没有使用
catch
,我想这会改变方法签名(添加
抛出
),从而导致不匹配。添加一个
catch
try
解决了它。