[英]Swift idiomatic error checking
假設您有這樣的函數:
func getSomething(error: NSErrorPointer) -> Something
你通常這樣使用它:
var error : NSError? = nil
let a = getSomething(&error)
在這里檢查錯誤的慣用方法是什么? 更具體的問題:
error == nil
,我們可以假設a
永遠不會為零,反之亦然嗎? error
(為了它的nilness)還是a
(確認它不是零)? a != nil && error != nil
在某些情況下是否為真? 謝謝!
比較“錯誤處理編程指南”中從方法返回的處理錯誤對象 :
重要說明:方法的返回值表示成功或失敗。 雖然在Cocoa錯誤域中間接返回錯誤對象的Cocoa方法可以保證返回這樣的對象,如果方法通過直接返回nil或NO來指示失敗,你應該在嘗試對之做任何事情之前檢查返回值為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)")
}
如果函數返回一個可選值,即
func someFunc(someVar: String) -> NSData? {
// some code
}
(可選意味着它可以返回nil)然后錯誤檢查非常簡單
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中錯誤檢查和處理的一個非常好的參考
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.