web-dev-qa-db-ja.com

メソッドによってスローされたエラーを無視するエレガントな方法

次のようにNSFileManagerを使用して一時ファイルを削除しています:

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

呼び出しが行われたときにファイルがそこにあるかどうか、そしてすでに削除されているかどうかは気にしません。

do/catchを使用せずに、スローされたエラーを無視するSwiftに伝えるためのエレガントな方法は何でしょうか?

29
Desmond Hume

あなたが成功を気にしないかどうか、あなたは呼び出すことができます

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

Swiftドキュメンテーションの "Error Handling" から:

_try?_を使用して、エラーをオプションの値に変換し、エラーを処理します。 _try?_式の評価中にエラーがスローされた場合、式の値はnilです。

removeItemAtURL()は "nothing"(別名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)
_

警告なしでコンパイルします。

51
Martin R