guard let для раннего выхода
Извлекайте значение и выполняйте ранний выход при ошибке, уменьшая вложенность.
«guard let для раннего выхода» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Идея раннего выхода
guard проверяет условие и, если оно не выполняется, выходит из текущей области действия. Эта конструкция предназначена для раннего выхода, благодаря которому основной сценарий не оказывается внутри отступов.
func greet(_ name: String?) {
guard let name else {
print("No name")
return
}
print("Hello, \(name)")
}
greet("Ada")
greet(nil)Синтаксис guard let
Запишите guard let value = optional else { return }. В отличие от if let, распакованное значение остаётся доступным после конструкции guard.
func double(_ text: String) {
guard let n = Int(text) else {
print("Not a number")
return
}
print(n * 2)
}
double("8")
double("x")Значение остаётся доступным
Поскольку при неудаче guard выполняет выход, компилятор знает, что после него значение существует. В оставшейся части функции его можно использовать обычным образом.
func length(of text: String?) {
guard let text else { return }
let count = text.count
print(count)
}
length("hello")Блок else должен завершаться выходом
Блок else в проверке предварительного условия должен покидать текущую область видимости: с помощью return, break, continue или throw. Это проверяется компилятором.
func process(_ value: Int?) {
guard let value else {
return
}
print("Processing \(value)")
}
process(99)Сокращённая форма привязки
Как и if let, проверка предварительного условия поддерживает сокращённую форму: guard let name else { ... }, если имена совпадают.
func show(_ name: String?) {
guard let name else {
print("missing")
return
}
print(name)
}
show("Kai")Плоский основной путь выполнения
Главное преимущество guard — плоский и понятный основной путь выполнения. Сравните вложенные пирамиды if let с последовательностью проверок предварительных условий.
func register(name: String?, age: Int?) {
guard let name else { return }
guard let age else { return }
print("\(name) is \(age)")
}
register(name: "Mia", age: 28)Проверка обычных условий
Проверка предварительного условия работает с любым логическим условием, а не только с опциональными значениями. guard count > 0 else { return } обеспечивает ранний выход.
func divide(_ a: Int, by b: Int) {
guard b != 0 else {
print("Cannot divide by zero")
return
}
print(a / b)
}
divide(10, by: 2)
divide(10, by: 0)Проверка предварительного условия в циклах
Внутри цикла проверка предварительного условия может выполнить continue, чтобы пропустить итерацию, если данные отсутствуют.
let inputs = ["1", "x", "3"]
for item in inputs {
guard let n = Int(item) else { continue }
print(n * 10)
}Несколько привязок в одной проверке
Одна проверка предварительного условия может распаковать несколько опциональных значений, разделённых запятыми. Чтобы продолжить выполнение, все они должны успешно распаковаться.
func combine(_ a: String?, _ b: String?) {
guard let a, let b else { return }
print(a + b)
}
combine("foo", "bar")Проверки с дополнительными условиями
После привязки через запятую можно добавить логические условия, чтобы точнее определить, когда проверка предварительного условия считается пройденной.
func validate(_ text: String?) {
guard let text, !text.isEmpty else {
print("invalid")
return
}
print("ok: \(text)")
}
validate("")
validate("hi")Когда выбирать ранний выход
Используйте guard для предварительных условий в начале функции, а if let — когда значение нужно ненадолго только внутри ветви.
func area(width: Int?, height: Int?) -> Int {
guard let width, let height else { return 0 }
return width * height
}
print(area(width: 3, height: 4))Быстрая проверка
Проверьте привязку с помощью guard let.
Повторение: ранний выход с привязкой
guard let value else { return } распаковывает опциональное значение и оставляет его доступным в области видимости ниже. Его блок else должен завершать выполнение, благодаря чему основной путь остаётся плоским и понятным.
func f(_ x: Int?) {
guard let x else { return }
print(x)
}
f(5)Изучай Swift с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 122
- Уроки
- 409
Часто задаваемые вопросы
Урок «guard let для раннего выхода» бесплатный?
Да — полный текст урока «guard let для раннего выхода» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «guard let для раннего выхода»?
Извлекайте значение и выполняйте ранний выход при ошибке, уменьшая вложенность. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «guard let для раннего выхода»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- if let и сокращённая привязка
- guard let для раннего выхода
- Привязка нескольких необязательных значений
- Шаблон Optional в switch и for