- Объяснять, что такое опциональный тип (
Int?,String?) иnil - Безопасно извлекать значение опционала с помощью
if letиguard let - Задавать значение по умолчанию через
??и строить опциональные цепочки через?.
У одних контактов в телефоне есть адрес электронной почты, у других — нет. Пользователь может ввести в поле возраста «пятнадцать» вместо «15» — такой текст в число не превратить. Программы сталкиваются с ситуацией «значения нет» каждый день. Во многих языках это приводит к неожиданным сбоям, а в Swift для этого есть особый инструмент — опционалы.
Что такое опционал?
Тип, который либо хранит значение определённого типа, либо не хранит ничего (nil). Записывается со знаком вопроса после имени типа: Int? — «либо Int, либо nil».
Обычная переменная типа Int никогда не бывает пустой — Swift это гарантирует. Если значения может не быть, тип объявляют опциональным. Например, Int("42") пытается превратить строку в число, и результат имеет тип Int?, потому что преобразование может не удаться.
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.
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. Обычно его используют в функциях — функция это именованный блок кода, подробно ты изучишь её в отдельном уроке.
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.
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.
Int("25")?