2016-08-17 4 views
4

Я использовал следующий код без проблем до обновления до Xcode 8 beta 6. Он похож на this example из репозитория Alamofire. Сегодня утром я обновил свою библиотеку Alamofire до последней ветки swift3, которая теперь совместима с бета-версией 6. Она показывает ошибку: Cannot call value of non-function type 'HTTPURLResponse?' Аналогичный вопрос существует here, но он не основан на текущей версии Swift и Alamofire.ResponseSerializer 'не может вызывать значение нефункционного типа «NSHTTPURLResponse?» С Swift 3

Из того, что я понимаю, эта ошибка, потому что думает, что я пытаюсь вернуть Request свойства response вместо функции response(responseSerializer: <T>, completionHandler: <(Response<T.SerializedObject, T.ErrorObject>) -> Void>) и думает, что это из-за ошибки типа либо в responseSerializer или completionHandler, что я передаю в функцию.

Как настроить этот код, чтобы он совместим с объявлением функции и компилятором?

Я добавил @escaping к завершениюHandler, чтобы исправить ошибку.

import Foundation 
import Alamofire 
import SwiftyJSON 

extension Alamofire.Request { 
public func responseObject<T: ResponseJSONObjectSerializable>(_ completionHandler: @escaping (Response<T, NSError>) -> Void) -> Self { 
    let responseSerializer = ResponseSerializer<T, NSError> { request, res, data, error in 

     guard let responseData = data else { 
      let error = DFError.error(withDFCode: .dataSerializationFailed, failureReason: "Data could not be serialized because input data was nil.") 
      return .failure(error) 
     } 

     let jsonData: Any? 
     do { 
      jsonData = try JSONSerialization.jsonObject(with: responseData, options: []) 
     } catch { 
      let error = DFError.error(withDFCode: .jsonSerializationFailed, failureReason: "JSON could not be serialized into response object") 
      return .failure(error) 
     } 

     let json = SwiftyJSON.JSON(jsonData!) 
     if let newObject = T(json: json) { 

      return .success(newObject) 
     } 

     let error = DFError.error(withDFCode: .jsonSerializationFailed, failureReason: "JSON could not be serialized into response object") 
     return .failure(error) 
    } 

    return response(responseSerializer: responseSerializer, completionHandler: completionHandler) 
    //Error: Cannot call value of non-function type 'HTTPURLResponse?' 
} 
} 
+0

Не могли бы вы переименовать параметр 'response' в своем закрытии на что-то еще? –

+1

BTW, я подозреваю, что [SE-0103] (https://github.com/apple/swift-evolution/blob/master/proposals/0103-make-noescape-default.md) является причиной проблемы для вас Это дело. –

+0

@ J.Cocoe Спасибо, но я только что обновил закрытие до 'ResponseSerializer {request, res, data, error in' и ошибка сохраняется. – blwinters

ответ

8

Вы должны пометить ваш completionHandler в @escaping.

+0

Спасибо! Так оно и было. – blwinters

+0

Спасибо за это. –

3

Я все еще видел эту ошибку даже после добавления @escaping к закрытию. Проблема была в том, что мне нужно было изменить мою декларацию расширения от extension Alamofire.Request { } до extension Alamofire.DataRequest { }.