Swift Academy · レッスン

列挙型による状態機械のモデル化

Swiftの列挙型でアプリの状態遷移を安全に表現します。

レッスン 4/412 ステップ

「列挙型による状態機械のモデル化」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

ようこそ

enumは有限ステートマシンのモデル化に適しています。各caseが1つの状態を表し、遷移は次の状態を返す関数として定義します。この方法により、不正な状態を表現できないようにできます。

単純な状態enum

```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 } } ```

enumステートマシンを使う理由

利点: • 網羅的なswitch — コンパイラーがすべての状態の処理を強制します • 不正な組み合わせが不可能です(たとえば、データのない`loaded`) • 状態は値なので、テスト、コピー、ログ出力が簡単です • UIは状態に応じてswitchし、適切に描画できます

状態に基づくUIの描画

```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 } ``` Flux/Reduxスタイルのアーキテクチャでは、単一のルート状態structにまとめます。

クイックチェック

enumのステートマシンがコンパイル時に安全なのはなぜですか?

まとめ

重要なポイント: • 各caseが状態を表し、遷移は次の状態を返す関数です • 関連値によって、状態固有のデータを保持できます • 網羅的なswitchにより、コンパイラーがすべての状態の処理を強制します • 純粋な遷移関数はユニットテストが簡単です • 複数のステートマシンをルート状態structにまとめられます コース完了です!次は、プロトコル合成です。
無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「列挙型による状態機械のモデル化」レッスンは無料ですか?

はい。「列挙型による状態機械のモデル化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「列挙型による状態機械のモデル化」で何を学びますか?

Swiftの列挙型でアプリの状態遷移を安全に表現します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「列挙型による状態機械のモデル化」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Raw ValueとCaseIterable
  2. 豊富なデータのための関連値
  3. Indirect列挙型と再帰的な構造
  4. 列挙型による状態機械のモデル化
← Swift Academyに戻る