Swiftのenum(列挙型)のざっくりまとめ

Objective-Cの列挙型といえば、C言語と同じく整数型の値を複数持つものでしたが、Swiftの列挙型ではかなり柔軟かつ多機能なものになっています。

その列挙型について少しまとめてみました。

定義

Swiftの列挙型(enum)は以下のように定義できます。

enum Fruits {
  //定数なのでアッパーキャメルケースで記述
  case Apple
  case Orange
  case Grape
  case Banana

  //以下のようにも記述できる
  case Apple, Orange, Grape, Banana
}

列挙型のメンバは定数や変数に代入可能

var f1 = Fruits.Apple
let f2: Fruits = .Orange

2種類の列挙型

C言語ではメンバには整数型の値を格納することができましたが、Swiftでは値型と共用型の列挙型があります。

  • 値型の列挙型 : 全メンバが同じデータ型を持つ. 実体型(raw type)の指定が必要
  • 共用型の列挙型 : それぞれのメンバが異なる構造を持つ. 実体型の指定はしない.
// 値型の列挙型
enum Weather: Int {
  case Sunny = 0
  case Cloudy     // 1
  case Rainy       // 2
  case Thunder    // 3
}

//値型の場合、rawValueで参照することができる
let w = Weather.Sunny
w.rawValue // w = 0 (Int)

//共用型の列挙型
enum Ticket {
  case Single(Int, Date, Child: Bool) //タプルで型の定義
  case OneDayPass(Date, Child: Bool)
  case SeniorPass String //文字列で型の定義
  case Card(Int, Child: Bool)
}

共用型では型がまったく異なるものをひとまとまりにできて便利に使えそうです.

列挙型でできること

Swiftの列挙型では、ただ単にまとまりのあるデータを定義するだけでなく、構造体やクラスと同等の機能が備わっています。 具体的には以下の通りです.

  • メソッドの定義
  • タイプメソッドの定義
  • 計算型プロパティの定義
  • タイププロパティの定義
  • イニシャライザの定義

以下は具体的なコード例です.

//メソッドの定義
enum Fruits {
  case Apple
  case Orange
  case Grape
  case Banana

  func description() -> String {
    switch self {
      case .Apple: return "Apple"
      case .Orange: return "Orange"
      case .Grape: return "Grape"
      case .Banana: return "Banana"
    }
  }
}
//タイプメソッドの定義
enum Fruits {
  case Apple
  case Orange
  case Grape
  case Banana

  //staticをつける
  static func description() -> String {
    return ["Apple","Orange","Grape","Banana"][self.rawValue]
  }
}
//計算型プロパティの定義
enum Fruits {
  case Apple
  case Orange
  case Grape
  case Banana

  var sphere: Bool {
    switch self {
      case .Apple, .Orange: return true
      default: return false
    }
  }

}
//イニシャライザの定義
enum Fruits {
  case Apple
  case Orange
  case Grape
  case Banana

  init() {
    self = Fruits.Apple
  }
}

//実行
var f = Fruits()   // .Apple

ざっくりとですが、Swiftでの列挙型をまとめてみました。Objective-Cでの列挙型と比べるとすごい高機能なので、いろいろ便利に使っていきたいです。

また、列挙型ではprotocolに準拠することもできるみたいなので、そこらへんも後々触っていけたらなと思います。