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我知道这不是在回答问题,尽管我可以就 Swift 中错误处理的工作方式提供指导,但这对你来说可能会容易得多。
AFNetworking 有一个名为 AlamoFire 的专用 Swift 库。如果您的项目使用 Swift,那么使用 AFNetworking 库的 swift 版本可能会有所帮助。可以在这里找到:
https://github.com/Alamofire/Alamofire
【讨论】:
【参考方案2】:我认为您并不需要返回 BOOL
值。如果一切正常,则应为true
,否则应为false
。
对于 Swift 2,您应该使用 do
、try
和 catch
。
您可以捕获错误并将其转换为 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》学习笔记(Day 52)——Cocoa错误处理模式
如何实现通用 do-try-catch 块以捕获操作中引发的所有错误