Перейти к содержанию
Educora
Средний16 мин4 / 14

Опционалы: когда значения может не быть

Безопасно обрабатывай в Swift ситуацию «значения нет» с помощью опционалов: `nil`, `if let`, `guard let`, `??` и опциональные цепочки.

Проверь себя
В этом уроке ты узнаешь
  • Объяснять, что такое опциональный тип (Int?, String?) и nil
  • Безопасно извлекать значение опционала с помощью if let и guard let
  • Задавать значение по умолчанию через ?? и строить опциональные цепочки через ?.

У одних контактов в телефоне есть адрес электронной почты, у других — нет. Пользователь может ввести в поле возраста «пятнадцать» вместо «15» — такой текст в число не превратить. Программы сталкиваются с ситуацией «значения нет» каждый день. Во многих языках это приводит к неожиданным сбоям, а в Swift для этого есть особый инструмент — опционалы.

Что такое опционал?

Определение
Опционал

Тип, который либо хранит значение определённого типа, либо не хранит ничего (nil). Записывается со знаком вопроса после имени типа: Int? — «либо Int, либо nil».

Обычная переменная типа Int никогда не бывает пустой — Swift это гарантирует. Если значения может не быть, тип объявляют опциональным. Например, Int("42") пытается превратить строку в число, и результат имеет тип Int?, потому что преобразование может не удаться.

Swift
let age = Int("42")
let wrong = Int("hello")
var middleName: String? = nil
middleName = "Ali"

print(age)
print(wrong)
print(middleName)
Ожидаемый результат
Optional(42)
nil
Optional("Ali")

Обрати внимание: при выводе опционала значение видно внутри «коробки» Optional(...), а Xcode показывает жёлтое предупреждение. Чтобы воспользоваться значением из коробки, его сначала нужно извлечь (по-английски unwrap). Просто написать age + 1 нельзя, потому что Int? и Int складывать нельзя.

Извлечение через `if let` и `guard let`

if let проверяет: если внутри опционала есть значение, оно записывается в новую константу и выполняется блок; если там nil, срабатывает блок else. Внутри блока number — уже обычный Int.

Swift
let input = "15"

if let number = Int(input) {
    print("Next year you will be \(number + 1).")
} else {
    print("That is not a number.")
}

let nickname: String? = nil
if let nickname {
    print("Hi, \(nickname)!")
} else {
    print("No nickname yet.")
}
Ожидаемый результат
Next year you will be 16.
No nickname yet.

guard let работает наоборот: если значения нет, выполняется блок else, и он обязан выйти из текущего кода (через return, break или continue). Если значение есть, извлечённое имя доступно во всём коде после guard. Обычно его используют в функциях — функция это именованный блок кода, подробно ты изучишь её в отдельном уроке.

Swift
func greet(_ name: String?) {
    guard let name else {
        print("Hello, guest!")
        return
    }
    print("Hello, \(name)!")
    print("Your name has \(name.count) letters.")
}

greet("Aysel")
greet(nil)
Ожидаемый результат
Hello, Aysel!
Your name has 5 letters.
Hello, guest!

`??` и опциональные цепочки

Оператор ?? задаёт значение по умолчанию: если слева есть значение, берётся оно, если там nil — значение справа. ?. — это опциональная цепочка: она обращается к свойству или методу опционала только тогда, когда значение есть, а при nil всё выражение спокойно возвращает nil.

Swift
let savedName: String? = nil
let displayName = savedName ?? "Anonymous"
print(displayName)
print(Int("abc") ?? 0)

let email: String? = "leyla@example.com"
let noEmail: String? = nil
print(email?.count)
print(noEmail?.count)
print(email?.uppercased() ?? "no email")
print(noEmail?.uppercased() ?? "no email")
Ожидаемый результат
Anonymous
0
Optional(17)
nil
LEYLA@EXAMPLE.COM
no email

Обрати внимание: email?.count возвращает не просто Int, а Int? — если хоть одно звено цепочки может быть nil, результат тоже опционален. Поэтому ?. и ?? часто используют вместе.

СпособЧто делаетБезопасно?
if let x = optвыполняет блок, если значение естьда
guard let x = opt else { … }выходит из кода, если значения нетда
opt ?? defaultподставляет значение по умолчанию вместо nilда
opt?.propertyобращается, только если значение естьда
opt!извлекает принудительно; при nil программа падаетнет
Способы извлечь значение опционала

Главное

  • Тип T? хранит либо значение типа T, либо nil; обычные типы никогда не бывают nil.
  • if let выполняет блок, если значение есть; guard let выходит из кода, если его нет.
  • ?? подставляет значение по умолчанию вместо nil: Int("abc") ?? 0 → 0.
  • Результат цепочки ?. тоже опционален.
  • Принудительное извлечение через ! роняет программу при nil — избегай его.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Какой тип у выражения Int("25")?