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

时间:2015-09-16 21:15:59

标签: ios swift afnetworking swift2

我在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 {

} 

在这种情况下,如何同时获取值和错误?

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

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

2 个答案:

答案 0 :(得分:0)

我知道这并没有回答这个问题,虽然我可以提供有关Swift错误处理方式的指导,但这对你来说可能要容易得多。

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

https://github.com/Alamofire/Alamofire

答案 1 :(得分:0)

我认为你真的不需要返回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开始:)