2015-09-25 7 views
25

メソッドによってスローされたエラーを無視するエレガントな方法:コールが行われたときにファイルがある場合私はこのような<code>NSFileManager</code>で一時ファイルを削除してい

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

私は本当に気にしないのと、それがすでに削除されている場合は、そのままにしてください。 do/catchを使用せずに、任意のスローエラーを無視するスウィフトを伝えるためのエレガントな方法は何でしょう

答えて

40

、あなたは成功を気にしないかどうか、あなたはスウィフト文書で"Error Handling"から

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

を呼び出すことができる場合:に変換することにより

は、あなたがエラーを処理するためにtry?を使用しますオプションの値。 try?式の評価中にエラーがスローされた場合 、式の値 はnilです。

removeItemAtURL()戻り "何も"(別名Void)は、try?式のため、戻り値はOptional<Void>です。 この戻り値を_に割り当てると、「try?」という結果がにならないようにします。使用されていません "警告。

あなたは、あなたがnilに対してtry?の 戻り値をテストすることができますスローされた特定のエラーの呼び出しの結果ではなく、 にのみ関心がある場合:

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値に関する警告は表示されないので、変わっていて矛盾しています。どうして "試してみるべき?"行う?私はアップルがもう少しスウィフト版でこれを修正することを願っています。 – Lensflare

+0

素晴らしい説明をありがとう。 !! –

関連する問題