Выбор ответа Senior Ошибки обновлено

Тип Never в Swift

Вопрос

Почему в guard let url = URL(string: s) else { fatalError("bad url") } компилятор не требует return?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: fatalError возвращает Never, управление из него не вернётся. Функция с типом результата Never никогда не возвращает управление: она завершает процесс, бесконечно крутится или бросает.

Варианты ответа

  1. fatalError возвращает Never, управление из него не вернётсяправильный ответ
  2. fatalError это ключевое слово языка, такое же, как return
  3. В guard выход необязателен, если тело else не пустое
  4. Компилятор вставляет return после fatalError автоматически сам

Разбор

Функция с типом результата Never никогда не возвращает управление: она завершает процесс, бесконечно крутится или бросает. Компилятор использует это в анализе потока управления, поэтому else в guard считается выходом. Свои функции тоже можно объявить -> Never, например func unreachable(_ m: String) -> Never. Never ещё и пустой enum, его используют как тип ошибки, которой не бывает: Result<Int, Never>, throws(Never).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.