2016-09-20 39 views
3

我刚刚开始从swift 2.2-> 3.0转换我的旧项目。在这个过程中,我不得不将Alamofire更新到4.0版以获得对新版Swift版本的支持。我已经修好了最多,但是我现在不了了之。无法调用非函数类型'HTTPURLResponse?'的值 - Alamofire 4.0

任何人都可以解释为什么在过去return语句显示以下错误:

Cannot call value of non-function type 'HTTPURLResponse?'

具体做法是:

return response(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) 
} 
+0

您是否找到任何解决方法?我有完全相同的问题。 – Ryan

+0

是的,虽然编译器没有完全告诉我们原因。真正的问题是DataResponse只接受一个模板类而不是NSError/Error。所以它应该是:(DataResponse )而不是(DataResponse ,错误?)。 ErrorCode应该改为使用swift 3 AFError – Mat0

回答

3

@ 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<Any>

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

而且@escaping是至关重要的completionHandler参数。

相关问题