簡體   English   中英

Swift慣用錯誤檢查

[英]Swift idiomatic error checking

假設您有這樣的函數:

func getSomething(error: NSErrorPointer) -> Something

你通常這樣使用它:

var error : NSError? = nil
let a = getSomething(&error)

在這里檢查錯誤的慣用方法是什么? 更具體的問題:

  1. 如果error == nil ,我們可以假設a永遠不會為零,反之亦然嗎?
  2. 我們應該先檢查一下: error (為了它的nilness)還是a (確認它不是零)?
  3. 可以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM