0Pricing
Swift Academy · Урок

Моделирование конечных автоматов с помощью перечислений

Безопасно представляйте переходы состояния приложения с помощью перечислений Swift.

«Моделирование конечных автоматов с помощью перечислений» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Введение

Перечисления идеально подходят для моделирования конечных автоматов. Каждый вариант является состоянием, а переходы — функциями, возвращающими следующее состояние. Такой подход делает недопустимые состояния непредставимыми.

Простое перечисление состояний

```swift enum TrafficLight { case red, yellow, green func next() -> TrafficLight { switch self { case .red: return .green case .green: return .yellow case .yellow: return .red } } } var light = TrafficLight.red light = light.next() // .green ```

Состояния с дополнительными данными

```swift enum LoadState { case idle case loading(progress: Double) case loaded(T) case failed(Error) } var state: LoadState<[String]> = .idle state = .loading(progress: 0.5) state = .loaded(["alice","bob"]) ```

Функция перехода

```swift func transition(_ state: LoadState, event: AppEvent) -> LoadState { switch (state, event) { case (.idle, .startFetch): return .loading(progress: 0) case (.loading, .progress(let p)): return .loading(progress: p) case (.loading, .success(let d)): return .loaded(d) case (.loading, .error(let e)): return .failed(e) default: return state } } ```

Почему конечные автоматы на перечислениях?

Преимущества: • Исчерпывающий `switch` — компилятор требует обработать все состояния • Недопустимые комбинации невозможны (например, `loaded` без данных) • Состояние является значением — его легко тестировать, копировать и записывать в журнал • Интерфейс может переключаться по состоянию и отображать соответствующее содержимое

Отрисовка интерфейса по состоянию

```swift func render(_ state: LoadState<[User]>) { switch state { case .idle: showEmptyView() case .loading(let p): showProgress(p) case .loaded(let users): showList(users) case .failed(let err): showError(err) } } ```

Конечный автомат состояния проигрывателя

```swift enum PlayerState { case stopped case playing(track: String, position: TimeInterval) case paused(track: String, position: TimeInterval) } ``` Только `playing` и `paused` содержат трек — у `stopped` его нет, поэтому модель сама объясняет своё назначение.

Предотвращение недопустимых переходов

```swift extension PlayerState { mutating func play(track: String) { guard case .stopped = self else { return } self = .playing(track: track, position: 0) } mutating func pause() { if case .playing(let t, let p) = self { self = .paused(track: t, position: p) } } } ```

Тестирование конечных автоматов

```swift func testLight() { var l = TrafficLight.red assert(l.next() == .green) assert(l.next().next() == .yellow) } ``` Конечные автоматы с чистыми функциями переходов легко проверять модульными тестами — макеты не нужны.

Композиция конечных автоматов

В больших приложениях часто одновременно работают несколько конечных автоматов: ```swift struct AppState { var auth: AuthState var data: LoadState<[Article]> var ui: UIState } ``` Объединяйте их в одной корневой структуре состояния для архитектур с однонаправленным потоком данных.

Быстрая проверка

Что делает конечные автоматы на перечислениях безопасными на этапе компиляции?

Итоги

Основные выводы: • Каждый вариант — это состояние, а переходы — функции, возвращающие следующее состояние • Ассоциированные значения содержат данные, относящиеся к конкретному состоянию • Исчерпывающий `switch` обеспечивает обработку состояний под контролем компилятора • Чистые функции переходов легко проверять модульными тестами • Несколько конечных автоматов можно объединить в корневой структуре состояния Курс завершён! Далее: композиция протоколов.

Часто задаваемые вопросы

Урок «Моделирование конечных автоматов с помощью перечислений» бесплатный?

Да — полный текст урока «Моделирование конечных автоматов с помощью перечислений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Моделирование конечных автоматов с помощью перечислений»?

Безопасно представляйте переходы состояния приложения с помощью перечислений Swift. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Моделирование конечных автоматов с помощью перечислений»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Исходные значения и CaseIterable
  2. Связанные значения для сложных данных
  3. Косвенные перечисления и рекурсивные структуры
  4. Моделирование конечных автоматов с помощью перечислений
← Назад к Swift Academy