iPhone
iOS
Swift
More than 1 year has passed since last update.

SwiftのENUMについて調べたのでメモとして残す

宣言

基本の宣言は以下になる
宣言の名前が違ければ、値が被ってもエラーにならない。

Swift

enum Fruits {
  case Apple
  case Banana
  case Orange
}

enum Kudamono {
  case Apple
  case Banana
  case Orange
}

,でつないで宣言することも可能

enum Fruits {Apple, Banana, Orange}

使い方は

var fruits = Fruits.Apple

もしくは

var fruits: Fruits = .Apple

Objective-C

Obj-Cの場合は下記は2重定義でエラーになる
だから宣言のprefixを付けて回避していた

// エラー
typedef NS_ENUM(NSUInteger, Fruits) {
  Apple,
  Banana,
  Orange
};

typedef NS_ENUM(NSUInteger, Kudamono) {
  Apple,
  Banana,
  Orange
};

// prefix付けて回避してた
typedef NS_ENUM(NSUInteger, Fruits) {
  FruitsApple,
  FruitsBanana,
  FruitsOrange
};

typedef NS_ENUM(NSUInteger, Kudamono) {
  KudamonoApple,
  KudamonoBanana,
  KudamonoOrange
};

宣言に値を入れられる

case Fruits {
  case Apple = "りんご"
  case Banana = "ばなな"
  case Orange = "おれんじ"
}

値の取り出し方

rawValueで値にアクセスすることができる

var fruits = Fruits.Apple.rawValue
println(fruits) // りんご

関数定義

列挙型の中に関数作ることができる

case Fruits {
  case Apple
  case Banana
  case Orange

  func toString() -> String {
    switch self
    case .Apple:
      return "りんご"
    case .Banana:
      return "ばなな"
    case .Orange:
      return "おれんじ"
  }
}

使い方

var fruits = Fruits.Banana.toString()
println(fruits) // ばなな

値に引数をもたせられる

列挙型の値に引数を持たせ宣言することができる

enum User {
  case Name(String, String)
  case Address(String)
}

switch分などの評価時に引数を展開することが可能

var name = User.Name("たろう", "さとう")

switch name {
  case. Name(let firstName, let lastName):
    let fullName = "\(lastName) \(firstName)"
    println(fullName) // さとう たろう
  case. Address(let address):
    let address = address
}

Switch文

列挙した値を網羅してないとエラーになる

case Fruits {
  case Apple = "りんご"
  case Banana = "ばなな"
  case Orange = "おれんじ"
}

網羅してないと下記の場合エラーになる

// エラー
// Orangeがない
switch fruits {
case .Apple:
  println("りんご")
case .Banana:
  println("ばなな")
}

全部網羅してる、もしくは下記のようにdefaultで分岐すればOK

switch fruits {
case .Apple:
  println("りんご")
case .Banana:
  println("ばなな")
default:
  println("default")
}

できることが多い印象