# Разработка логики игры CodeBreaker на SwiftUI: от модели до анимаций

Источник: https://www.youtube.com/watch?v=IvOF3Bmk-94
Канал: Stanford Online
Опубликовано: 25.11.2025

---

## Разработка логики игры CodeBreaker на SwiftUI
[[JUMP:00:05]]

Лекция посвящена разделению архитектуры приложения на Model и UI, а также реализации полноценной логики игры CodeBreaker. Разработчик демонстрирует, как создать структуру данных, которая не зависит от интерфейса, и связывает её с визуальными элементами SwiftUI.

### 🏗 Моделирование данных: Основа игры
[[JUMP:00:34]]

Основная идея заключается в том, что интерфейс является лишь «манифестацией» (отображением) модели данных. Для реализации модели автор предлагает использовать `struct`, так как это стандарт для подобных задач в Swift.

*   **Структура `CodeBreaker`:** Это «сердце» игры. Модель хранит мастер-код, текущую догадку игрока, массив предыдущих попыток и набор допустимых цветов (пешек).
*   **Использование `struct` для кодов:** Код состоит из набора пешек (`Pegs`) и типа кода (`Kind`). Тип кода (мастер-код, догадка или попытка) реализован через `enum`, который находится внутри структуры для обеспечения чистоты имен (namespaces).
*   **Гибкость типов с `typealias`:** Пешка (`Peg`) первоначально представлена через `typealias` для типа `Color`. Однако ведущий подчеркивает, что это временное упрощение: в рамках домашнего задания студентам предстоит перевести пешки на тип `String`, чтобы поддерживать эмодзи, так как `Color` слишком тесно связан с UI.

### 🖥 Интеграция модели в SwiftUI
[[JUMP:13:06]]

Для того чтобы UI корректно отображал данные, необходимо создать экземпляр модели внутри View.

*   **State-менеджмент:** Разработчик использует макрос `@State`, чтобы пометить переменную `game` как источник истины. Это необходимо для того, чтобы SwiftUI мог автоматически отслеживать изменения и перерисовывать только те части интерфейса, которые были модифицированы.
*   **Рефакторинг кода:** Ведущий демонстрирует полезную функцию Xcode — `Refactor -> Rename`, которая позволяет безопасно переименовать `ContentView` в `CodeBreakerView` во всех частях проекта, включая комментарии и файлы.
*   **Обработка ввода (Multi-touch):** Для взаимодействия с пешками используется модификатор `.onTapGesture`. В текущей реализации тапы по пешкам в режиме догадки циклически меняют их цвет, обращаясь к методу модели `changeGuessPeg`.

### ⚙️ Логика мутации и работа с опционалами
[[JUMP:27:33]]

Одной из центральных тем лекции является работа с изменяемыми данными в структурах.

*   **Mutating-функции:** Поскольку структуры передаются по значению, любая функция, изменяющая состояние (`attemptGuess`, `changeGuessPeg`), должна быть помечена как `mutating`.
*   **Безопасная работа с опционалами:** При поиске индекса пешки используется `if let` (вместо принудительного извлечения через `!`), что предотвращает возможные сбои программы, если элемент не найден в коллекции.
*   **Nil Coalescing:** В случаях, когда данных нет, применяется оператор `??` для установки значения по умолчанию — `Code.missing`, который в UI отображается как прозрачный элемент (`.clear`).

### 🎬 Анимация и пользовательский опыт
[[JUMP:48:49]]

Для того чтобы игра ощущалась как качественное iOS-приложение, автор внедряет основы работы с анимацией.

*   **`withAnimation`:** Использование этого модификатора при добавлении попытки заставляет SwiftUI плавно анимировать появление новых элементов и смещение старых.
*   **`ScrollView`:** Использование этого контейнера решило две проблемы: оно позволило прокручивать список попыток, если их станет слишком много, и автоматически разместило кнопку «Guess» в нижней части экрана.
*   **Масштабируемость:** Ведущий показывает, как с помощью `.minimumScaleFactor` можно сделать текст динамически подстраивающимся под размеры кнопки, чтобы он не обрезался.