SwiftのenumとFailable Initializers

基本的なenumの作り方は以下。

enum CoffeeShop {
  case starbucks
  case doutor
  case tullys
}

let shop1 = CoffeeShop.starbucks
//  starbucks

何かのデータから数字をもらって、値を返すようなことがしたければ、 これにIniitializerをつけて以下のようにできる。

enum CoffeeShop {
  case starbucks
  case doutor
  case tullys

  init(id: Int) {
    switch id {
    case 0: self = .starbucks
    case 1: self = .doutor
    case 2: self = .tullys
    default: self = .starbucks
    }
  }
}

let shop2 = CoffeeShop(id: 1)
// doudor

この場合switch文は考慮されうる範囲(idに0, 1, 2以外のものが来た場合)を全て許容しなければならないのでdefaultが必要になる。

let shop2 = CoffeeShop(id: 10)
// starbucks

しかし、基本的にdefaultをstarbucksとしておくことは、イレギュラーだと考えられるので、Failable Initializersというものをつかう。

enum CoffeeShop {
  case starbucks
  case doutor
  case tullys

  init?(id: Int) {
    switch id {
    case 0: self = .starbucks
    case 1: self = .doutor
    case 2: self = .tullys
    default: return nil
    }
  }
}

let shop2 = CoffeeShop(id: 100)
// nil

これは、初期化に失敗できるイニシャライザで失敗した時、今回の場合だと想定していない数字が来た時に return nilnilを返すことで結果がないことを明示できる。

意外と便利で今後活用していく予定です。