使用alamofire的Swift 2.0迁移错误

时间:2015-09-17 18:17:58

标签: ios swift swift2 alamofire

我正在尝试使用这段代码,我在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

上的原始代码

2 个答案:

答案 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)
}
}