Я использовал следующий код без проблем до обновления до 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?'
}
}
Не могли бы вы переименовать параметр 'response' в своем закрытии на что-то еще? –
BTW, я подозреваю, что [SE-0103] (https://github.com/apple/swift-evolution/blob/master/proposals/0103-make-noescape-default.md) является причиной проблемы для вас Это дело. –
@ J.Cocoe Спасибо, но я только что обновил закрытие до 'ResponseSerializer {request, res, data, error in' и ошибка сохраняется. –
blwinters