📚

もう迷わない!Swiftのenum使いこなし術📝 タスク管理アプリにも役立つ強力な列挙型

に公開

はじめに 👋

こんにちは!Swiftでアプリ開発をしていると、「この値はいくつかの決まった選択肢の中から選びたいな…」とか、「状態によって関連する情報も一緒に管理したいな…」なんて思うこと、ありませんか?そんな時に大活躍するのが enum(列挙型) です!

この記事では、Swiftのenumの基本的な使い方から、他の言語と比べても特に強力で便利な機能(Raw Values、Associated Values、メソッドなど)までを、具体的なコード例を交えながら分かりやすく解説します。

特に、これからタスク管理アプリを作ってみたいと考えている方には、enumがどのように役立つかの具体的なアイデアもご紹介しますので、ぜひ最後までお付き合いください!

この記事を読めば、あなたもSwiftのenumを自信を持って使いこなせるようになるはずです✨


enum(列挙型)とは? 🤔

enum(イーナム) とは、関連する一連の値をグループ化して、それに名前をつけるための型です。
例えば、「信号機の色」というグループには「赤」「黄」「青」という決まった値がありますよね。これをプログラムで分かりやすく、かつ安全に扱うためにenumを使います。

Swiftでの基本的な定義はシンプルです。

enum Signal {
    case red
    case yellow
    case blue
}

let currentSignal = Signal.blue
print(currentSignal) // blue

これにより、currentSignalには定義されたケース(red, yellow, blue)以外の値が入ることを防げます。


Swift enumが持つ便利な機能たち 🚀

Swiftのenumは、他言語のenumと比べて非常に多機能で柔軟です。代表的な便利機能を見ていきましょう!

1. Raw Values(生の関連値) 🔢

各ケースに固定値を関連付けられます。

enum TaskPriority: String {
    case high = "最優先"
    case medium = "通常"
    case low = "できれば"
}

let myPriority = TaskPriority.high
print(myPriority.rawValue) // "最優先"

if let priorityFromServer = TaskPriority(rawValue: "通常") {
    print(priorityFromServer) // medium
}

// IntのRaw Value
enum TabItem: Int {
    case home = 0
    case tasks
    case settings
}

print(TabItem.tasks.rawValue) // 1

2. Associated Values(関連値) 🎁

各ケースが追加データを持つことができます。

enum TaskStatus {
    case todo
    case inProgress(percentageComplete: Double)
    case completed(onDate: Date)
    case deferred(reason: String)
}

var currentTaskStatus = TaskStatus.inProgress(percentageComplete: 75.0)

func printStatusDetail(status: TaskStatus) {
    switch status {
    case .todo:
        print("未着手")
    case .inProgress(let percentage):
        print("進行中: \(percentage)%")
    case .completed(let date):
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        print("完了日: \(formatter.string(from: date))")
    case .deferred(let reason):
        print("保留: \(reason)")
    }
}

printStatusDetail(status: currentTaskStatus)

3. メソッドとコンピューテッドプロパティ 🛠️

enumもメソッドやプロパティを持つことができます。

enum PriorityLevel: String {
    case P1 = "緊急かつ重要"
    case P2 = "重要だが緊急ではない"
    case P3 = "緊急だが重要ではない"
    case P4 = "緊急でも重要でもない"

    var description: String {
        switch self {
        case .P1: return "最優先タスク"
        case .P2: return "重要タスク"
        case .P3: return "委任可能タスク"
        case .P4: return "後回し可能タスク"
        }
    }

    func getAlertColor() -> String {
        switch self {
        case .P1: return "Red"
        case .P2: return "Orange"
        case .P3: return "Yellow"
        case .P4: return "Gray"
        }
    }
}

let myTaskPriority = PriorityLevel.P1
print(myTaskPriority.description)
print("色: \(myTaskPriority.getAlertColor())")

タスク管理アプリでの活用アイデア 📝

  1. タスクの優先度 (Raw Values & CaseIterable)
  2. タスクのステータス (Associated Values)
  3. 繰り返し設定(複雑な条件)
  4. ソート順(並び替え基準)
  5. エラーの種類(エラーハンドリング)

enumを使うメリットまとめ ✨

  • 可読性の向上
  • 型安全性の確保
  • 保守性の向上
  • switch文との相性が抜群

おわりに 🥳

Swiftのenumを使いこなし、コードをより安全で分かりやすく、Swiftらしく書いていきましょう!

Discussion