Подтвердить что ты не робот

Элегантный способ игнорировать любые ошибки, вызванные методом

Я удаляю временный файл с NSFileManager следующим образом:

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

Мне все равно, есть ли файл там, где был сделан вызов, и если он уже удален, пусть будет.

Каким будет элегантный способ сказать Swift игнорировать любые брошенные ошибки, не используя do/catch?

4b9b3361

Ответ 1

Если вас не волнует успех или нет, вы можете позвонить

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

От "Обработка ошибок" в документации Swift:

Вы используете try? для обработки ошибки путем преобразования ее в необязательное значение. Если при оценке выражения try? возникает ошибка, значение выражения nil.

removeItemAtURL() возвращает "ничего" (aka Void), поэтому возвращаемое значение выражения try? равно Optional<Void>. Присвоение этого возвращаемого значения _ позволяет избежать "результата" try? не используется ".

Если вас интересует только результат вызова, но не в конкретную ошибку, которая была брошена, тогда вы можете протестировать возвращаемое значение 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)

компилируется без предупреждений.