NS_ENUMとNS_OPTIONS

iOS 6 / Mac OS X 10.8からNS_ENUMとNS_OPTIONSが使えるようになった。
http://nshipster.com/ns_enum-ns_options/

使い分け方をまとめると、

  • ビットマスクを使うとき : NS_OPTIONS
  • それ以外 : NS_ENUM
■OKパターン
typedef NS_OPTIONS(NSUInteger, ESampleStateAnimal) {
    ESampleStateCat  = 1 << 0,
    ESampleStateDog  = 1 << 1,
    ESampleStateBird = 1 << 2,
};

ESampleStateAnimal state = ESampleStateCat | ESampleStateDog;
■NGパターン
typedef NS_ENUM(NSUInteger, ESampleStateAnimal) {
    ESampleStateCat  = 1 << 0,
    ESampleStateDog  = 1 << 1,
    ESampleStateBird = 1 << 2,
};

ESampleStateAnimal state = ESampleStateCat | ESampleStateDog; <= コンパイルエラー

NS_ENUMは、コンパイラの種類によって挙動が変わる。
C++コンパイラだとORでマスクした時、暗黙的にenumにキャストされず、コンパイルエラーになる。