🍎 Swift

Opcionales en Swift

Опциональные типы 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 — видеоуроки для визуальных учеников
  • Практические проекты — создавай что-то настоящее!