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の選択肢
enumをPickerの選択肢として使用し、選択された値に基づいて処理を行うことができます。
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)")
}
}enumにCaseIterableプロトコルを準拠させることで、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というenumにbackgroundColorメソッドを定義しています。このメソッドは、enumの値に応じて異なる背景色を返します。
まとめ
SwiftUIにおけるenumの使い方は非常に多岐にわたります。enumの基本的な使い方から、関連値を持つ複雑な状態管理、メソッドの定義に至るまで、その用途は広範囲に及びます。
アプリに合わせて使い方を工夫するとコードの整理や効率的なプログラムの構築に役立つことがありますので、活用してみてください。

