kitoko552.memo

kitoko552のメモ

Objective-CからSwiftのenumを使う

要点

  • enumの宣言の前に@objcをつける。
  • enumはIntとして宣言する必要がある。
  • IntでないenumはObjective-Cからは使えない。
// 使えない
enum Hoge: String {
  case hoge
  ...
}

// 使える
@objc enum Hoge: Int {
  case hoge
  ...
}

Swiftのenum

Swiftではenumの自由度がかなり高いです。
特に異なるタプル構造を持たせることができる機能は特徴的だと言えます。

enum Season {
  case Spring(String)
  case Summer(Int, Int)
  case Autumn
  case Winter(Int)
}

当然ながら、Objective-Cのenumにはこんな機能はありません。
このことからもわかるように、Objective-CとSwiftのenumは別物なのです。

Objective-Cのenum

Objective-Cのenumの実体は、NSIntegerかNSUIntegerです。
このため、普通にSwiftで書いたenumをObjective-Cから使うのは不可能なのです。

enum Season{
  Spring = 0,
  Summer,
  Autumn = 9,
  Winter
};

Intとして宣言する

しかし、NSInteger, NSUIntegerとIntは変換可能です。
なので、enumをIntとして宣言してやればObjective-Cのenumにも事実上変換可能です。
あとは、宣言の先頭に@objcを書いてあげればコンパイラが勝手にObjective-Cのenumとして理解してくれます。

@objc enum Season: Int {
  case Spring, Summer, Autumn, Winter
}

Int以外は不可能

ただし、残念ながらInt以外の型で宣言しているenumはObjective-Cからは使えません。
例えば、こんなenumは変換不可能なのであきらめましょう。

// 型を持っていないenum
enum Season {
  case Spring, Summer, Autumn, Winter
}

// Stringなenum
enum Season: String {
  case Spring, Summer, Autumn, Winter
}

// union typeなenum
enum Season {
  case Spring(String)
  case Summer(Int, Int)
  case Autumn
  case Winter(Int)
}

おわり