Что выведет код Middle Ошибки обновлено
Что выведет Swift: defer внутри do и catch
Вопрос
Что выведет код?
enum ValidationError: Error { case empty, tooShort(Int) }
func validate(_ s: String) throws {
if s.isEmpty { throw ValidationError.empty }
if s.count < 3 { throw ValidationError.tooShort(s.count) }
}
for s in ["", "ab", "abc"] {
do {
defer { print("checked") }
try validate(s)
print("ok", s)
} catch ValidationError.tooShort(let n) {
print("short", n)
} catch {
print("other", error)
}
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: checked, other empty, checked, short 2, ok abc, checked. defer принадлежит области do и выполняется при выходе из неё, в том числе по ошибке, то есть до блока catch.
Что выведет
checked
other empty
checked
short 2
ok abc
checked
Разбор
defer принадлежит области do и выполняется при выходе из неё, в том числе по ошибке, то есть до блока catch. Первая ошибка empty не подходит под паттерн tooShort и попадает в общий catch, где печатается как имя кейса.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.