无法转换'T?'类型的值 预期的参数类型'_?' - 通用类型和完成块

mab*_*ril 5 generics completionhandler swift alamofire swift2

我想实现AlamofireObjectMapper(https://github.com/tristanhimmelman/AlamofireObjectMapper)与Alamofire 3和ObjectMapper(最新版本https://github.com/Hearst-DD/ObjectMapper).

似乎AlamofireObjectMapper没有更新与Alamofire 3合作,所以我试图自己做.

我来到这段代码,现在我被卡住了.

似乎通用类型T在响应的完成块内是不可访问的.是Alamofire3改变还是Swift 2.1改变?

这是错误:

无法转换'T?'类型的值 预期的参数类型'_?'

  public func responseObject<T: Mappable>(queue: dispatch_queue_t?, keyPath: String?, completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, AnyObject?, ErrorType?) -> Void) -> Self {
    return response(queue: queue) { (request, response, data, error) -> Void in
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
            let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
            let result = JSONResponseSerializer.serializeResponse(request, response, data, error)
            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 ?? response.data, result.error) // Here it shows the error: Cannot convert value of type 'T?' to expected argument type '_?' 
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

mab*_*ril 14

刚刚找到解决方案.这似乎是Xcode 7.1 beta编译器的一个问题.它在"parsedObject"参数上给出了问题,并且下一个参数出错了.

completionHandler(self.request!, self.response, parsedObject, **result.value ?? data**, result.error)
Run Code Online (Sandbox Code Playgroud)

因此,如果您碰巧遇到相同的错误,请查看所有其他参数是否正常.

祝好运.

  • 哈哈.幸运的是,我很早就看到了你的回答.由于swifts有用的错误消息,这种错误可能需要数小时才能完成调试.非常感谢 (4认同)