Что выведет код 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 ошибок.