Какое требование к ветке else делает guard let пригодным для гарантии доступности извлечённой переменной после проверки?
Ветка else у guard let обязана завершать текущий путь выполнения: например, выполнять return, throw, break, continue или вызывать невозвращающую функцию. Благодаря этому после guard компилятор знает, что выполнение продолжается только при успешном извлечении значения, поэтому связанная переменная доступна до конца текущей области видимости.
Обычная проверка Optional часто требует вложенного if let, из-за чего основной сценарий оказывается внутри условного блока. guard предназначен для раннего выхода при невыполнении предварительного условия и поддерживает линейную структуру кода с явной обработкой ошибочного случая.
Такой подход уменьшает вложенность и одновременно делает контроль потока проверяемым компилятором: нельзя незаметно продолжить выполнение после неуспешной проверки.
Если значение отсутствует, использование его как обычного значения может привести к ошибке выполнения, особенно при принудительном извлечении. Но одной проверки недостаточно: компилятор должен убедиться, что после отрицательного результата выполнение не попадёт в код, рассчитывающий на наличие значения.
Если бы else мог завершиться обычным переходом к следующей инструкции, переменная, объявленная через guard let, не имела бы гарантии существования. Поэтому Swift требует, чтобы ветка else не завершалась нормально.
guard let проверяет Optional и создаёт извлечённую переменную во внешней области видимости. При успешной проверке выполнение идёт дальше, а при nil выполняется else; после этой ветки текущий путь обязан покинуть область или перейти к следующей итерации цикла.
Здесь city после guard имеет тип String, а не String?, и доступна до конца функции. В отличие от if let, где связанная переменная обычно ограничена телом if, guard делает успешный результат доступным в оставшейся части текущей области.
Допустимы разные виды выхода: return из функции, throw из throwing-функции, break или continue внутри цикла, а также вызов функции с типом Never. Недопустима ветка else, которая просто заканчивается и позволяет исполнению продолжиться после guard.
guard не извлекает значение магически и не меняет сам Optional. Он лишь вводит новую переменную с non-Optional-типом после доказательства, что значение присутствует.
Функция обработки запроса получает Optional-токен. Вариант с if let безопасен, но при нескольких предварительных проверках быстро создаёт вложенные блоки. Принудительное извлечение короче, но при nil завершает программу ошибкой.
Выбранный вариант — несколько последовательных guard: каждый некорректный сценарий обрабатывается немедленно, а основной путь остаётся плоским. Это улучшает читаемость, гарантирует область действия извлечённых значений и исключает продолжение выполнения после неуспешной проверки.
Можно ли написать в else у guard обычный код без выхода?
Нет. Ветка else должна завершать текущий путь управления. Сообщение компилятора указывает, что тело guard не может завершиться нормально. Сам факт изменения переменной или вызова обычной функции без типом Never это требование не выполняет.
Доступна ли переменная из guard внутри вложенного замыкания?
Да, если замыкание создаётся в области, где эта переменная видима. Она захватывается как обычная локальная переменная. При этом особенности захвата изменяемых переменных замыканием остаются отдельной темой и не меняются из-за использования guard.
Чем отличается guard let от проверки Optional через guard без связывания?
Проверка условия может подтвердить факт, например отсутствие nil, но не всегда создаёт извлечённое значение. guard let одновременно проверяет Optional и объявляет переменную с типом Wrapped, доступную после guard. Поэтому для последующего безопасного использования содержимого обычно применяют именно optional binding, а не только проверку условия.