假设您有这样的功能:
func getSomething(error: NSErrorPointer) -> Something
并且您通常以这种方式使用它:
var error : NSError? = nil
let a = getSomething(&error)
在这里检查错误的惯用方法是什么?更具体的问题:
error == nil
我们可以假设a
永远不会是零和副
反之亦然?error
(因为它的无效)或a
(来自
确认它不是零)?a != nil && error != nil
可以为真吗?谢谢!
答案 0 :(得分:8)
比较Handling Error Objects Returned From Methods 在"错误处理编程指南":
重要提示:成功或失败由返回值表示 方法。虽然Cocoa方法间接返回错误对象 如果是,Cocoa错误域保证返回这样的对象 方法通过直接返回nil或NO来表示失败,你应该 在尝试之前,始终检查返回值是否为“否” 使用NSError对象执行任何操作。
因此对于Cocoa / Cocoa Touch方法,您应该始终检查返回值
价值第一。如果方法失败,保证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版本
以上例子:
JSON序列化
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)")
}
答案 1 :(得分:0)
如果函数返回一个可选值,即
func someFunc(someVar: String) -> NSData? {
// some code
}
(可选意味着它可以返回零) 然后错误检查非常简单
if let data = someFunc("someString") {
// this means there was NO error as the function didn't return a nil
}
else {
// This means there was an error
}
此视频非常适合在swift https://youtu.be/m8szaLqHVDs
中进行错误检查和处理