无法调用非函数类型“HTTPURLResponse?”的值- 阿拉莫菲尔 4.0

Posted

技术标签:

【中文标题】无法调用非函数类型“HTTPURLResponse?”的值- 阿拉莫菲尔 4.0【英文标题】:Cannot call value of non-function type 'HTTPURLResponse?' - Alamofire 4.0 【发布时间】:2016-09-20 19:29:24 【问题描述】:

我刚开始从 swift 2.2->3.0 转换我的旧项目。在这个过程中,我不得不将 Alamofire 更新到 4.0 版以获得对新 swift 版本的支持。我修的最多,但我做不到这个?

谁能解释为什么最后一个return语句显示以下错误:

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

具体来说:

返回响应(responseSerializer:responseSerializer,completionHandler:completionHandler)

extension Alamofire.DataRequest 
func responseTVArray(_ completionHandler: @escaping (DataResponse<TVWrapper>, Error?) -> Void) -> Self 
    let responseSerializer = DataResponseSerializer<TVWrapper>  request, response, data, error in
        guard error == nil else  return .failure(error!) 

        guard let responseData = data else
        
            let failureReason = "Array could not be serialized because input data was nil."

            let userInfo = [NSLocalizedFailureReasonErrorKey: failureReason]
            let error = NSError(domain: "UMAT", code: ErrorCode.DataSerializationFailed.rawValue, userInfo: userInfo)

            return .failure(error)
        

        let JSONResponseSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)
        let result = JSONResponseSerializer.serializeResponse(request, response, responseData, error)

        switch result 
        case .success(let value):
            let json = SwiftyJSON3.JSON(value)
            let wrapper = TVWrapper()
            wrapper.page = json["page"].intValue
            wrapper.totalPages = json["total_pages"].intValue
            wrapper.totalResults = json["total_results"].intValue

            var allTV:Array = Array<TV>()

            let results = json["results"]

            for jsonTV in results
            
                let tv = TV(json: jsonTV.1, id: Int(jsonTV.0) )
                if (tv.posterPath == "")
                
                    continue
                
                else
                
                    allTV.append(tv)
                

            
            wrapper.results = allTV
            return .success(wrapper)
        case .failure(let error):
            return .failure(error)
        
    

    return response(responseSerializer: responseSerializer, completionHandler: completionHandler)

【问题讨论】:

您找到解决方法了吗?我也有同样的问题。 是的,尽管编译器并没有完全告诉我们原因。真正的问题是 DataResponse 只需要一个模板类,而不是 NSError/Error 了。所以它应该是:(DataResponse) 而不是 (DataResponse, Error?)。并且 ErrorCode 应该改为使用 swift 3 AFError 【参考方案1】:

@Mat0 感谢您的评论。我写这个答案是因为我还有更多的地方需要解决。

下面是我在Swift 2.2的方法。

func responseSLJSON(completionHandler: Response<AnyObject, NSError> -> Void,
                             errorHandler: (String, Result<AnyObject, NSError>) -> NSError = Request.slError()) -> Self 

    let responseSerializer = ResponseSerializer<AnyObject, NSError> 
        request, response, data, error in

        let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments)

        guard error == nil else 
            let errorResult = JSONSerializer.serializeResponse(request, response, data, nil)
            return .Failure(errorHandler(#function, errorResult))
        

        return JSONSerializer.serializeResponse(request, response, data, error)
    

    return response(responseSerializer: responseSerializer, completionHandler: completionHandler)

我把它转换成...

func responseSLJSON(completionHandler: @escaping (DataResponse<Any>) -> Void,
                    errorHandler: @escaping (String, Result<Any>) -> NSError = DataRequest.slError()) -> Self 

    let responseSerializer = DataResponseSerializer<Any> 
        request, response, data, error in

        let jsonSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)

        guard error == nil else 
            let errorResult = jsonSerializer.serializeResponse(request, response, data, nil)
            return .failure(errorHandler(#function, errorResult))
        

        return jsonSerializer.serializeResponse(request, response, data, error)
    

    return response(responseSerializer: responseSerializer, completionHandler: completionHandler)

return response(responseSerializer: responseSerializer, completionHandler: completionHandler) 在这种情况下与参数类型有关。我不得不使用Any 而不是AnyObject,因为jsonResponseSerializer 返回DataResponseSerializer&lt;Any&gt;

public static func jsonResponseSerializer(
    options: JSONSerialization.ReadingOptions = .allowFragments)
    -> DataResponseSerializer<Any>

对于completionHandler 参数,@escaping 也是必不可少的。

【讨论】:

以上是关于无法调用非函数类型“HTTPURLResponse?”的值- 阿拉莫菲尔 4.0的主要内容,如果未能解决你的问题,请参考以下文章

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

Alamofire 4:无法调用非函数类型“HTTPURLResponse?”的值

无法调用非函数类型“HTTPURLResponse?”的值- 阿拉莫菲尔 4.0

无法调用非函数类型“HTTPURLResponse?”的值阿拉莫菲尔 4,斯威夫特 3

Swift 3.0 迁移后的 Alamofire 错误:“无法将 '(URL, HTTPURLResponse)-> (URL)' 类型的值转换为预期的参数类型 'Parameters'”?

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