Swift2.0:如何通过 do try catch 获取返回值和错误

Posted

技术标签:

【中文标题】Swift2.0:如何通过 do try catch 获取返回值和错误【英文标题】:Swift2.0: How to get both return value and error with do try catch 【发布时间】:2015-09-16 21:15:58 【问题描述】:

我在 Objective-C 中有一个函数。此函数总是返回一个值,如果发生错误,则事件:

-(NSString *)test:(NSError **)error;

我在 Swift1 中重写它如下,这样我仍然可以同时获取值和错误。

override func test(error: NSErrorPointer) -> String 
    var error: NSError?
    let result = super.test(&error)
    ...

但现在在 swift2 中,我只能重写类似的函数

override func test() throws -> String 

 

这种情况下,如何同时获取value和error?

我这样做是因为我需要覆盖 AFNetworking 中的一个函数。需要返回值和错误。

- (id)responseObjectForResponse:(NSURLResponse *)response
                           data:(NSData *)data
                          error:(NSError *__autoreleasing *)error;    

【问题讨论】:

你可以返回一个元组(value, error) @zaph,谢谢您的回复。你的意思是我需要修改基类中的函数吗? 用 Enum 处理这种情况,它必须是这样的: enum Result case Success(T) case Failure(String) 请参阅下面的链接了解更多详情。 nomothetis.svbtle.com/error-handling-in-swift 【参考方案1】:

我知道这不是在回答问题,尽管我可以就 Swift 中错误处理的工作方式提供指导,但这对你来说可能会容易得多。

AFNetworking 有一个名为 AlamoFire 的专用 Swift 库。如果您的项目使用 Swift,那么使用 AFNetworking 库的 swift 版本可能会有所帮助。可以在这里找到:

https://github.com/Alamofire/Alamofire

【讨论】:

【参考方案2】:

我认为您并不需要返回 BOOL 值。如果一切正常,则应为true,否则应为false

对于 Swift 2,您应该使用 dotrycatch。 您可以捕获错误并将其转换为 NSError 实例。

例子:

do 
  try something()
  // continue if something() returned true otherwise -> catch
 catch let error as NSError 
  print(error.localizedDescription)

使用 AFNetworking,您可以执行以下操作以使用来自 JSON 的错误消息更改 NSError 本地化描述:

override func responseObjectForResponse(response: NSURLResponse!, data: NSData!) throws -> AnyObject 
  do 
    try self.validateResponse(response as! NSHTTPURLResponse, data: data)
   catch let error as NSError 
    let json = JSON(data: data) // i'm using SwiftyJSON : https://github.com/SwiftyJSON/SwiftyJSON
    if let errorMessage = json["error"].string 
      var userInfo = error.userInfo
      userInfo[NSLocalizedDescriptionKey] = errorMessage
      throw NSError(domain: error.domain, code: error.code, userInfo: userInfo)
    
  

  return try super.responseObjectForResponse(response, data: data)

也许有更好的方法可以做到这一点,但我从 Swift 2 开始:)

【讨论】:

以上是关于Swift2.0:如何通过 do try catch 获取返回值和错误的主要内容,如果未能解决你的问题,请参考以下文章

处理 Swift 2.0 中的转换错误

如何在 swift 2.0 中使用 catch 概念

《从零開始学Swift》学习笔记(Day 52)——Cocoa错误处理模式

如何实现通用 do-try-catch 块以捕获操作中引发的所有错误

《从零开始学Swift》学习笔记(Day 52)——Cocoa错误处理模式

如何在 Swift 中正确获取 Do-Catch 范围之外的值(使用 Try)