الخيارات (Optionals) في سويفت
Опциональные типы Swift (Optional): безопасная работа с nil
Опциональные типы — самая важная и уникальная особенность Swift. Они решают проблему "ошибки на миллиард долларов" — неожиданного null/nil, который приводит к крашам приложений!
"Ошибка на миллиард долларов"
В 1965 году учёный Тони Хоар придумал null-ссылку. В 2009 году он написал: "Я называю это моей ошибкой на миллиард долларов. Это изобретение null-ссылки привело к бесчисленным ошибкам и убыткам."
В Java, JavaScript, C++ — переменная может быть null в любой момент. Программисты часто забывают это проверять. Результат — NullPointerException!
Swift решил это элегантно: Optional явно показывает, что значения может не быть.
Что такое Optional
// Обычные переменные ВСЕГДА содержат значение let name: String = "Саша" // Гарантированно String let age: Int = 25 // Optional — может содержать значение или nil var optionalName: String? = "Маша" // Optional<String> var optionalAge: Int? = nil optionalName = nil // Можно установить nil optionalName = "Петя" // Или обратно значение // Нельзя: // name = nil // ❌ ОШИБКА!
if let — безопасное извлечение
var username: String? = "Саша"
if let name = username {
// Здесь name — это String (не Optional!), гарантированно не nil
print("Привет, \(name)!")
} else {
print("Пользователь не найден")
}
// Swift 5.7+: можно использовать то же имя!
if let username {
print("Привет, \(username)!")
}
guard let — ранний выход при nil
func greetUser(_ username: String?) {
guard let name = username else {
print("Имя не указано, отменяем")
return
}
// Здесь name — String, не Optional
print("Привет, \(name)!")
}
greetUser("Саша") // Привет, Саша!
greetUser(nil) // Имя не указано, отменяем
?? — оператор nil-coalescing
var savedName: String? = nil
let displayName = savedName ?? "Гость"
print("Добро пожаловать, \(displayName)!") // Гость
savedName = "Маша"
let displayName2 = savedName ?? "Гость"
print(displayName2) // Маша
Force unwrap ! — ОПАСНО!
var optionalText: String? = "Привет" let text = optionalText! // "Привет" optionalText = nil // let crash = optionalText! // 💥 CRASH! // Используй ! ТОЛЬКО если на 100% уверен
Optional chaining ?.
class Person {
var name: String
var address: Address?
init(name: String) { self.name = name }
}
class Address {
var city: String
var street: String?
init(city: String) { self.city = city }
}
let person = Person(name: "Саша")
person.address = Address(city: "Москва")
person.address?.street = "Ленина"
// ?. — если любое звено nil, результат nil
let streetName = person.address?.street?.uppercased()
print(streetName ?? "Адрес не указан") // ЛЕНИНА
map и flatMap для Optional
let optionalNumber: Int? = 42
let doubled = optionalNumber.map { $0 * 2 }
print(doubled) // Optional(84)
let numberString: String? = "42"
let parsedNumber = numberString.flatMap { Int($0) }
print(parsedNumber) // Optional(42)
let badString: String? = "не число"
let failed = badString.flatMap { Int($0) }
print(failed) // nil
Практический пример: парсинг ввода
func calculateBMI(weightStr: String?, heightStr: String?) -> String {
guard let ws = weightStr,
let hs = heightStr,
let weight = Double(ws),
let height = Double(hs),
weight > 0, height > 0 else {
return "Ошибка: введите корректные данные"
}
let bmi = weight / (height * height)
switch bmi {
case ..<18.5: return "ИМТ: \(String(format: "%.1f", bmi)) — Недостаток веса"
case 18.5..<25: return "ИМТ: \(String(format: "%.1f", bmi)) — Норма ✅"
case 25..<30: return "ИМТ: \(String(format: "%.1f", bmi)) — Избыток"
default: return "ИМТ: \(String(format: "%.1f", bmi)) — Ожирение"
}
}
print(calculateBMI(weightStr: "70", heightStr: "1.75"))
// ИМТ: 22.9 — Норма ✅
Итоги урока
- Optional — тип, который может содержать значение ИЛИ nil
- Обычные типы в Swift не могут быть nil — это безопасно!
if let— безопасное извлечение значенияguard let— ранний выход если nil??— значение по умолчанию если nil!— принудительное извлечение (опасно!)?.— optional chaining для безопасных вызовов
💪 Дополнительные упражнения
Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!
- Напиши программу, которая считает количество гласных в строке
- Создай функцию, которая проверяет является ли число простым
- Реализуй простую игру "угадай число" с подсказками
- Напиши калькулятор с четырьмя операциями
- Создай программу-органайзер задач (TODO list)
📋 Лучшие практики
Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:
- DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
- KISS (Keep It Simple, Stupid) — пиши простой и понятный код
- Именование — переменные должны отражать смысл:
userAgeлучше чемx - Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
- Маленькие функции — каждая функция должна делать одно дело
📚 Полезные ресурсы для дальнейшего изучения
- Официальная документация — лучший источник правды
- Stack Overflow — ответы на вопросы программистов
- GitHub — смотри на реальные проекты с открытым кодом
- YouTube — видеоуроки для визуальных учеников
- Практические проекты — создавай что-то настоящее!
💪 Дополнительные упражнения
Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!
- Напиши программу, которая считает количество гласных в строке
- Создай функцию, которая проверяет является ли число простым
- Реализуй простую игру "угадай число" с подсказками
- Напиши калькулятор с четырьмя операциями
- Создай программу-органайзер задач (TODO list)
📋 Лучшие практики
Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:
- DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
- KISS (Keep It Simple, Stupid) — пиши простой и понятный код
- Именование — переменные должны отражать смысл:
userAgeлучше чемx - Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
- Маленькие функции — каждая функция должна делать одно дело
📚 Полезные ресурсы для дальнейшего изучения
- Официальная документация — лучший источник правды
- Stack Overflow — ответы на вопросы программистов
- GitHub — смотри на реальные проекты с открытым кодом
- YouTube — видеоуроки для визуальных учеников
- Практические проекты — создавай что-то настоящее!
💪 Дополнительные упражнения
Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!
- Напиши программу, которая считает количество гласных в строке
- Создай функцию, которая проверяет является ли число простым
- Реализуй простую игру "угадай число" с подсказками
- Напиши калькулятор с четырьмя операциями
- Создай программу-органайзер задач (TODO list)
📋 Лучшие практики
Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:
- DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
- KISS (Keep It Simple, Stupid) — пиши простой и понятный код
- Именование — переменные должны отражать смысл:
userAgeлучше чемx - Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
- Маленькие функции — каждая функция должна делать одно дело
📚 Полезные ресурсы для дальнейшего изучения
- Официальная документация — лучший источник правды
- Stack Overflow — ответы на вопросы программистов
- GitHub — смотри на реальные проекты с открытым кодом
- YouTube — видеоуроки для визуальных учеников
- Практические проекты — создавай что-то настоящее!
💪 Дополнительные упражнения
Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!
- Напиши программу, которая считает количество гласных в строке
- Создай функцию, которая проверяет является ли число простым
- Реализуй простую игру "угадай число" с подсказками
- Напиши калькулятор с четырьмя операциями
- Создай программу-органайзер задач (TODO list)
📋 Лучшие практики
Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:
- DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
- KISS (Keep It Simple, Stupid) — пиши простой и понятный код
- Именование — переменные должны отражать смысл:
userAgeлучше чемx - Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
- Маленькие функции — каждая функция должна делать одно дело
📚 Полезные ресурсы для дальнейшего изучения
- Официальная документация — лучший источник правды
- Stack Overflow — ответы на вопросы программистов
- GitHub — смотри на реальные проекты с открытым кодом
- YouTube — видеоуроки для визуальных учеников
- Практические проекты — создавай что-то настоящее!
💪 Дополнительные упражнения
Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!
- Напиши программу, которая считает количество гласных в строке
- Создай функцию, которая проверяет является ли число простым
- Реализуй простую игру "угадай число" с подсказками
- Напиши калькулятор с четырьмя операциями
- Создай программу-органайзер задач (TODO list)
📋 Лучшие практики
Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:
- DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
- KISS (Keep It Simple, Stupid) — пиши простой и понятный код
- Именование — переменные должны отражать смысл:
userAgeлучше чемx - Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
- Маленькие функции — каждая функция должна делать одно дело
📚 Полезные ресурсы для дальнейшего изучения
- Официальная документация — лучший источник правды
- Stack Overflow — ответы на вопросы программистов
- GitHub — смотри на реальные проекты с открытым кодом
- YouTube — видеоуроки для визуальных учеников
- Практические проекты — создавай что-то настоящее!
💪 Дополнительные упражнения
Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!
- Напиши программу, которая считает количество гласных в строке
- Создай функцию, которая проверяет является ли число простым
- Реализуй простую игру "угадай число" с подсказками
- Напиши калькулятор с четырьмя операциями
- Создай программу-органайзер задач (TODO list)
📋 Лучшие практики
Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:
- DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
- KISS (Keep It Simple, Stupid) — пиши простой и понятный код
- Именование — переменные должны отражать смысл:
userAgeлучше чемx - Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
- Маленькие функции — каждая функция должна делать одно дело
📚 Полезные ресурсы для дальнейшего изучения
- Официальная документация — лучший источник правды
- Stack Overflow — ответы на вопросы программистов
- GitHub — смотри на реальные проекты с открытым кодом
- YouTube — видеоуроки для визуальных учеников
- Практические проекты — создавай что-то настоящее!
💪 Дополнительные упражнения
Практика — ключ к успеху в программировании. Чем больше кода ты пишешь, тем лучше ты становишься. Не бойся экспериментировать — ошибки это часть обучения!
- Напиши программу, которая считает количество гласных в строке
- Создай функцию, которая проверяет является ли число простым
- Реализуй простую игру "угадай число" с подсказками
- Напиши калькулятор с четырьмя операциями
- Создай программу-органайзер задач (TODO list)
📋 Лучшие практики
Хороший код — это не просто работающий код. Это код, который легко читать, понимать и изменять. Следуй этим принципам:
- DRY (Don't Repeat Yourself) — не повторяй один и тот же код, выноси его в функции
- KISS (Keep It Simple, Stupid) — пиши простой и понятный код
- Именование — переменные должны отражать смысл:
userAgeлучше чемx - Комментарии — комментируй ПОЧЕМУ, а не ЧТО делает код
- Маленькие функции — каждая функция должна делать одно дело
📚 Полезные ресурсы для дальнейшего изучения
- Официальная документация — лучший источник правды
- Stack Overflow — ответы на вопросы программистов
- GitHub — смотри на реальные проекты с открытым кодом
- YouTube — видеоуроки для визуальных учеников
- Практические проекты — создавай что-то настоящее!