2015-09-25 72 views
25

我刪除臨時文件NSFileManager像這樣出現的任何錯誤:一種優雅的方式來忽略的方法

let fm = NSFileManager() 
fm.removeItemAtURL(fileURL) 
// error: "Call can throw but it is not marked with 'try'" 

我真的不關心,如果該文件是存在的調用時和如果它已被刪除,那就這樣吧。

如果不使用do/catch,那麼告訴Swift忽略任何拋出的錯誤的方法是什麼?

回答

40

如果你不關心成功與否,那麼你可以調用

let fm = NSFileManager.defaultManager() 
_ = try? fm.removeItemAtURL(fileURL) 

"Error Handling"雨燕文檔中:通過將其轉換成

您使用try?處理錯誤可選值。 如果在評估try?表達式時發生錯誤,則表達式的值 爲nil

removeItemAtURL()返回 「無」(又名Void),因此try?表達的返回值是Optional<Void>。 將此返回值分配給_可避免「嘗試?」的結果。未使用「警告。

如果你只對通話的結果感興趣,但不是在 其拋出,則特定的錯誤,你可以測試try?nil的 返回值:

if (try? fm.removeItemAtURL(fileURL)) == nil { 
    print("failed") 
} 

更新:Swift 3(Xcode 8),您不需要虛擬分配,至少不在此特定情況下:

let fileURL = URL(fileURLWithPath: "/path/to/file") 
let fm = FileManager.default 
try? fm.removeItem(at: fileURL) 

編譯沒有警告。

+1

謝謝。這無疑是最優雅的方式。但它仍然看起來很奇怪和不一致,因爲表達式包含可選的鏈接,如「foo?.bar()」不會顯示關於返回和未使用的可選Void值的警告。爲什麼要「嘗試?」做?我希望蘋果能夠用一些更進一步的Swift版本解決這個問題。 – Lensflare

+0

謝謝你的很好的解釋。 ! –

相關問題