【问题标题】:Swift 2.0 migration error with alamofire使用 alamofire 的 Swift 2.0 迁移错误
【发布时间】:2015-09-17 18:17:57
【问题描述】:

我正在尝试使用我在 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查看原始代码

【问题讨论】:

  • 很难提供准确的答案,因为整个项目都需要转换,我不知道您是如何转换 Alamofire 的库的。对于初学者,我会尝试返回一个非可选的 UIImage 并查看它是否有效,理想情况下你会修复 GenericResponseSerializer 以至少接受一个 UIImage? 可选。
  • 嗯,谢谢你的回答,但是当我将 UIImage 设置为返回类型时,xcode 被卡住了
  • @miracle-doh 你让它工作了吗?我正在使用 swift 2.0 和 alamofire 3.0 遵循相同的教程,但我遇到了 3 个内置错误
  • 是的,正确的答案是有效的。我是这样使用的Alamofire.request(.GET, imageURL).validate(contentType: ["image/*"]).responseImage() { (_, _, result) in guard let image = result.value else { print("could not fetch image value") return } //do stuff with image`}`

标签: ios swift swift2 alamofire


【解决方案1】:

当您将项目转换为 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 的代码,但这些错误消息应该会有所帮助。

【讨论】:

  • 如何更改responseImage 部分?
【解决方案2】:

它对我有用,从 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)
}
}

【讨论】:

    猜你喜欢
    • 2015-08-29
    • 2015-10-31
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多