假设您有一个像这样的函数:
func getSomething(error: NSErrorPointer) -> Something
而您通常以这种方式使用它:
var error : NSError? = nil let a = getSomething(&error)
在这里检查错误的惯用方式是什么?更具体的问题:
error == nil
a
error
a != nil && error != nil
谢谢!
比较 《错误处理编程指南》中从方法返回的处理错误对象:
重要提示: 方法的返回值指示成功或失败。尽管在方法可通过直接返回nil或NO指示失败的情况下,保证在该Cocoa错误域中间接返回错误对象的Cocoa方法可以保证返回此类对象,但是在尝试使用该方法执行任何操作之前,应始终检查返回值是否为nil或NO。 NSError对象。
因此,对于Cocoa / Cocoa Touch方法,您应该始终先检查返回值。可以保证error != nil方法失败,但是不能明确保证error == nil方法成功。
error != nil
例子:
JSON序列化
var error : NSError? if let jsonObj = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) { // success } else { // failure println("Invalid JSON data: \(error!.localizedDescription)") }
核心数据提取请求
var error : NSError? if let result = context.executeFetchRequest(request, error: &error) { // success, result has zero or more elements } else { // failure println("Fetch failed: \(error!.localizedDescription)") }
复制文件
var error : NSError? if !NSFileManager.defaultManager().copyItemAtPath(srcPath, toPath: dstPath, error: &error) { println("Cannot copy file: \(error!.localizedDescription)") }
当然,您可以为自己的功能定义自己的规则,但是我会遵循相同的Apple准则。
更新:从Swift 2开始, 将产生错误的Cocoa方法转换为引发错误的Swift函数,并且必须使用try- 处理该错误catch。这是上述示例的Swift 2版本:
try
catch
do { let jsonObj = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) // success } catch let error as NSError { // failure print("Invalid JSON data: \(error.localizedDescription)") }
do { let result = try context.executeFetchRequest(request) // success, result has zero or more elements } catch let error as NSError { // failure print("Fetch failed: \(error.localizedDescription)") }
do { try NSFileManager.defaultManager().copyItemAtPath(srcPath, toPath: dstPath) } catch let error as NSError { print("Cannot copy file: \(error.localizedDescription)") }