言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Swift辞典

  1. トップページ
  2. Swift辞典
  3. enum のメソッド・プロパティ・mutating

enum のメソッド・プロパティ・mutating

Swiftの enum はメソッドや計算型プロパティを持つことができます。また、自身のケースを変更するメソッドには『mutating』キーワードが必要です。

構文

enum 列挙型名 {
    case ケース1
    case ケース2

    // 計算型プロパティ
    var プロパティ名: 型 {
        switch self {
        case .ケース1: return 値1
        case .ケース2: return 値2
        }
    }

    // メソッド
    func メソッド名() {
        // 処理
    }

    // 自身を変更するメソッド(mutating)
    mutating func 変更メソッド() {
        self = .ケース2
    }
}

構文一覧

構文概要
var プロパティ: 型 { ... }計算型プロパティを定義します。
func メソッド名() { ... }通常のメソッドを定義します。
mutating func メソッド名()自身のケースを変更するメソッドを定義します。
static func メソッド名()型メソッドを定義します。
indirect enum再帰的な enum を定義します(自身を含むケースに必要)。

サンプルコード

// メソッドとプロパティを持つ enum
enum TrafficLight {
    case red, yellow, green

    // 計算型プロパティ
    var waitSeconds: Int {
        switch self {
        case .red:    return 60
        case .yellow: return 5
        case .green:  return 45
        }
    }

    var canGo: Bool {
        return self == .green
    }

    // インスタンスメソッド
    func description() -> String {
        switch self {
        case .red:    return "停止"
        case .yellow: return "注意"
        case .green:  return "進行"
        }
    }

    // mutating: 次のケースに変更
    mutating func next() {
        switch self {
        case .red:    self = .green
        case .green:  self = .yellow
        case .yellow: self = .red
        }
    }
}

var light = TrafficLight.red
print("\(light.description()) - 待機: \(light.waitSeconds)秒")
print("進める: \(light.canGo)")

light.next()
print("次: \(light.description())")

light.next()
print("次: \(light.description())")

概要

enum にメソッドやプロパティを追加することで、enum の各ケースに関連するロジックをまとめて管理できます。switch-case をメソッド内に封じ込めることで、呼び出し側のコードがシンプルになります。

enum は値型であるため、自身のケースを変更するメソッドには『mutating』キーワードが必要です。計算型プロパティは定義できますが、格納型プロパティ(var x: Int = 0 のような)は定義できません。

enum の基本についてはenum の基本 / case / switchを参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。