Обращение с пробкой и броски в Swift 3
Перед тем, как Swift 3 я использовал:
guard let data = Data(contentsOf: url) else {
print("There was an error!)
return
}
Однако теперь мне нужно использовать do
, try
и catch
. Я не знаком с этим синтаксисом. Как бы я воспроизвел это поведение?
Ответы
Ответ 1
Разница здесь в том, что Data(contentsOf: url)
больше не возвращает Необязательный, он бросает.
Итак, вы можете использовать его в Do-Catch, но без guard
:
do {
let data = try Data(contentsOf: url)
// do something with data
// if the call fails, the catch block is executed
} catch {
print(error.localizedDescription)
}
Обратите внимание, что вы все равно можете использовать guard
с try?
вместо try
, но тогда возможное сообщение об ошибке игнорируется. В этом случае вам не нужен блок Do-Catch:
guard let data = try? Data(contentsOf: url) else {
print("There was an error!")
// return or break
}
// do something with data
Ответ 2
Отключение распространения ошибок
Иногда вы знаете, что бросающая функция или метод не выдают ошибку во время выполнения. В этих случаях вы можете написать попробовать! перед выражением отключить распространение ошибок и обернуть вызов в утверждение времени выполнения, что не будет выдано никакой ошибки. Если на самом деле выдается ошибка, вы получите ошибку времени выполнения.
let data = try! Data(contentsOf: url)
Подробнее здесь