我正在尝试使用这段代码,我在Xcode 7中得到了raywenderlich.com但是在返回行中却给了我错误的说法
无法将
(NilLiteralConvertible, NilLiteralConvertible)
类型的返回表达式转换为返回类型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)
}
}
请参阅http://www.raywenderlich.com/85080/beginning-alamofire-tutorial
上的原始代码答案 0 :(得分:4)
看起来当您将项目转换为Swift 2时,您也升级到了AlamoFire 2.x.本教程是为Swift 1.2编写的,其中闭包的签名是:
(NSURLRequest?, NSHTTPURLResponse?, NSData?) -> (SerializedObject?, NSError?)
现在使用AlamoFire 2签名:
(NSURLRequest?, NSHTTPURLResponse?, NSData?) -> Result<SerializedObject>
这意味着您的方法需要在传递条件中返回.Success(image!)
并在失败条件中返回.Failure(data, myError)
。这也意味着你不能只是在没有展开的情况下传递图像,因为初始值设定项可以为空并且结果的参数不是。
您的序列化程序可能如下所示:
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)
}
对于您的错误,您可以定义自己的ErrorType
枚举,这对您有帮助或使用AlamoFire.Error
:
let error = Error.errorWithCode(.DataSerializationFailed, failureReason: "Image parsing failed.")
您的responseImage
功能需要进行类似的更改:
public func responseImage(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<UIImage>) -> Void) -> Self {
return response(responseSerializer: Request.imageResponseSerializer(), completionHandler: completionHandler)
}
这将要求您更新使用responseImage
的代码,但这些错误消息应该会有所帮助。
答案 1 :(得分:1)
它适用于我,从Ray的示例中删除旧的Alamofire,并添加git https://github.com/Alamofire/Alamofire的最新版本,并更改示例XMLResponseSerializer,对于UIImage,它看起来像:
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)
}
}