Enumについて使用例のまとめ【基本から応用まで】

この記事は約7分で読めます。

SwiftUIでは、enum(列挙型)を使用することで、関連する値をグループ化することができます。
enumは、限定された選択肢の中から1つを選ぶ際に特に有効です。
SwiftUIのビューやロジックの中で、特定の状態やカテゴリーを表すのにenumを活用することができます。

enumの基本

Swiftのenumは、Raw Values、Associated Values、メソッド、プロトコル準拠など、多くの機能をサポートしています。

基本的なenumの定義は以下の通りです:

enum Season {
    case spring, summer, autumn, winter
}

SwiftUIでのenumの使用例

1. ビューの状態管理

enumを使用してビューの状態を管理し、条件に応じて異なるビューを表示することができます。

import SwiftUI

enum LoadingState {
    case loading, success, failure
}

struct EnumSmpView: View {
    var state: LoadingState = .loading

    var body: some View {
        switch state {
        case .loading:
            Text("Loading...")
        case .success:
            Text("Content Loaded")
        case .failure:
            Text("Error Loading Content")
        }
    }
}

2. ボタンアクションの管理

異なるボタンアクションをenumで管理し、ボタンに対応するアクションを実行することができます。

import SwiftUI

enum Action {
    case delete, archive, move
}

struct EnumSmpView: View {
    var body: some View {
        Button("Delete") {
            performAction(.delete)
        }
        Button("Archiving") {
            performAction(.archive)
        }
        Button("Moving") {
            performAction(.move)
        }
    }
    
    func performAction(_ action: Action) {
        switch action {
        case .delete:
            print("Deleting")
        case .archive:
            print("Archiving")
        case .move:
            print("Moving")
        }
    }
}

3. Pickerの選択肢

enumPickerの選択肢として使用し、選択された値に基づいて処理を行うことができます。

import SwiftUI

enum Flavor: String, CaseIterable, Identifiable {
    case chocolate = "Chocolate"
    case vanilla = "Vanilla"
    case strawberry = "Strawberry"

    var id: String { self.rawValue }
}

struct EnumSmpView: View {
    @State private var selectedFlavor: Flavor = .chocolate

    var body: some View {
        Picker("Flavor", selection: $selectedFlavor) {
            ForEach(Flavor.allCases) { flavor in
                Text(flavor.rawValue).tag(flavor)
            }
        }
        Text("Selected flavor: \(selectedFlavor.rawValue)")
    }
}

enumCaseIterableプロトコルを準拠させることで、allCasesプロパティを通じてすべてのケースを配列として取得できます。これは、Pickerやリストでの選択肢としてenumを使用する場合に便利です。

4. 複雑な状態管理

enumの関連値(Associated Values)を使用することで、より複雑な状態管理を実現することが可能です。
これにより、enumの各ケースにデータを関連付け、そのデータを基に処理を行うことができます。

import SwiftUI

struct User {
    var id: Int
    var name: String
}
enum AuthenticationState {
    case loggedIn(user: User)
    case loggedOut
    case error(message: String)
}

struct EnumSmpView2: View {
    var authState: AuthenticationState = .loggedIn(user: User.init(id: 1, name: "sasaki"))

    var body: some View {
        switch authState {
        case .loggedIn(let user):
            Text("Welcome, \(user.name)")
        case .loggedOut:
            Text("Please log in")
        case .error(let message):
            Text("An error occurred: \(message)")
        }
    }
}

この例では、ログイン状態を管理するためにAuthenticationStateというenumを使用しています。
ログインしている場合はユーザー情報を、エラーが発生した場合はエラーメッセージを、それぞれ関連値として持つことができます。そして関連値をViewに表示させています。

5. enumとメソッド

enumにはメソッドも定義できます。これにより、enumの値に応じて異なる処理を行うメソッドを、enum内に直接定義することができます。

import SwiftUI

enum Theme {
    case light, dark

    func backgroundColor() -> Color {
        switch self {
        case .light:
            return Color.white
        case .dark:
            return Color.black
        }
    }
}

struct EnumSmpView2: View {
    var theme: Theme = .light

    var body: some View {
        Text("Hello, World!")
            .background(theme.backgroundColor())
    }
}
Theme:light
Theme: dark

この例では、ThemeというenumbackgroundColorメソッドを定義しています。このメソッドは、enumの値に応じて異なる背景色を返します。

まとめ

SwiftUIにおけるenumの使い方は非常に多岐にわたります。
enumの基本的な使い方から、関連値を持つ複雑な状態管理、メソッドの定義に至るまで、その用途は広範囲に及びます。

アプリに合わせて使い方を工夫するとコードの整理や効率的なプログラムの構築に役立つことがありますので、活用してみてください。

タイトルとURLをコピーしました