Swift 2.0 error de migration con alamofire

Estoy tratando de usar esta pieza de código que obtuve raywenderlich.com en Xcode 7. Pero en la línea de retorno me está dando error diciendo que

No se puede convertir la expresión de retorno del tipo (NilLiteralConvertible, NilLiteralConvertible) para devolver el tipo Result<UIImage>

 extension Alamofire.Request { public static func imageResponseSerializer() -> GenericResponseSerializer<UIImage> { return GenericResponseSerializer { request, response, data in if data == nil { return (nil, nil) } let image = UIImage(data: data!, scale: UIScreen.mainScreen().scale) return (image, nil) } } public func responseImage(completionHandler: (NSURLRequest, NSHTTPURLResponse?, UIImage?, NSError?) -> Void) -> Self { return response(responseSerializer: Request.imageResponseSerializer(), completionHandler: completionHandler) } } 

Vea el código original en http://www.raywenderlich.com/85080/beginning-alamofire-tutorial

Parece que cuando convertiste tu proyecto a Swift 2, también te pasaste a AlamoFire 2.x. El tutorial fue escrito para Swift 1.2 donde la firma del cierre fue:

 (NSURLRequest?, NSHTTPURLResponse?, NSData?) -> (SerializedObject?, NSError?) 

Con AlamoFire 2 la firma ahora es:

 (NSURLRequest?, NSHTTPURLResponse?, NSData?) -> Result<SerializedObject> 

Esto significa que su método debe devolver. El .Success(image!) En la condición de aprobación y .Failure(data, myError) en estado de falla. También significa que no puede pasar la image sin desenvolverlo ya que ese inicializador es anulable y el parámetro del resultado no.

Su serializador podría verse así:

 return GenericResponseSerializer { request, response, data in guard let validData = data else { let error = ... return .Failure(data, error) } guard let image = UIImage(data: validData, scale: UIScreen.mainScreen().scale) else { let error = ... return .Failure(data, error) } return .Success(image) } 

Para su error, puede definir su propia enumeración ErrorType que será útil para usted o utilizar AlamoFire.Error :

 let error = Error.errorWithCode(.DataSerializationFailed, failureReason: "Image parsing failed.") 

Su responseImage function de image necesitará un cambio similar:

 public func responseImage(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<UIImage>) -> Void) -> Self { return response(responseSerializer: Request.imageResponseSerializer(), completionHandler: completionHandler) } 

Esto a su vez requerirá que actualice el código que utiliza responseImage pero esos posts de error deberían ser útiles.

Funciona para mí, elimina el antiguo Alamofire de la muestra de Ray y agrega la última versión de la forma git https://github.com/Alamofire/Alamofire , y cambia la muestra XMLResponseSerializer, para UIImage se ve así:

 extension Alamofire.Request { public static func imageResponseSerializer() -> ResponseSerializer<UIImage, NSError> { return ResponseSerializer { request, response, data, error in guard error == nil else { return .Failure(error!) } guard let validData = data else { let failureReason = "Image parsing failed." let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason) return .Failure(error) } guard let image = UIImage(data: validData, scale: UIScreen.mainScreen().scale) else { let failureReason = "Image format failed." let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason) return .Failure( error) } return .Success(image) } } public func responseImage(completionHandler: Response<UIImage, NSError> -> Void) -> Self { return response(responseSerializer: Request.imageResponseSerializer(), completionHandler: completionHandler) } }