blwinters blwinters - 3 months ago 108
iOS Question

ResponseSerializer 'cannot call value of non-function type 'NSHTTPURLResponse?'' with Swift 3

I had been using the following code without issue until updating to Xcode 8 beta 6. It is similar to this example from the Alamofire repository. This morning I updated my Alamofire library to the latest

swift3
branch, which is now compatible with beta 6. It shows the error:
Cannot call value of non-function type 'HTTPURLResponse?'
A similar question exists here, but it is not based on the current version of Swift and Alamofire.

From what I understand, this error is because it thinks that I am trying to return the
Request
property
response
instead of the function
response(responseSerializer: <T>, completionHandler: <(Response<T.SerializedObject, T.ErrorObject>) -> Void>)
and it thinks this because of a type error in either the
responseSerializer
or
completionHandler
that I'm passing into the function.

How can I adjust this code to make it compatible with the function declaration and compiler?

Edit: I added @escaping to the completionHandler to show the correct code

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?'
}
}

Answer

You need to mark your completionHandler as @escaping.