32

Xcode5でclangを使用して次のコードを前処理しました。

typedef NS_ENUM(NSInteger, MyStyle) {
    MyStyleDefault,
    MyStyleCustom
};

typedef NS_OPTIONS(NSInteger, MyOption) {
    MyOption1 = 1 << 0,
    MyOption2 = 1 << 1,
};

そして、これを手に入れました。

typedef enum MyStyle : NSInteger MyStyle; enum MyStyle : NSInteger {
    MyStyleDefault,
    MyStyleCustom
};

typedef enum MyOption : NSInteger MyOption; enum MyOption : NSInteger {
    MyOption1 = 1 << 0,
    MyOption2 = 1 << 1,
};

NS_OPTIONS がビットマスク用であることは知っていますが、技術的な違いはありますか? それとも、これは命名規則のためだけですか?

編集

NS_OPTIONS の定義によると、おそらくコンパイラの互換性のためです。(特に C++ コンパイラの場合)

// In CFAvailability.h
// Enums and Options
#if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))
  #define CF_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
  #if (__cplusplus)
    #define CF_OPTIONS(_type, _name) _type _name; enum : _type
  #else
    #define CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type
  #endif
#else
  #define CF_ENUM(_type, _name) _type _name; enum
  #define CF_OPTIONS(_type, _name) _type _name; enum
#endif

clang の __cplusplus 値は 199711 ですが、これが何のためにあるのかを正確にテストすることはできません。

4

4 に答える 4

54

列挙型とビットマスク (オプション) には基本的な違いがあります。列挙型を使用して、排他的な状態を一覧表示します。ビットマスクは、複数のプロパティを同時に適用できる場合に使用されます。

どちらの場合も整数を使用しますが、見方が異なります。列挙型では数値を調べ、ビットマスクでは個々のビットを調べます。

typedef NS_ENUM(NSInteger, MyStyle) {
    MyStyleDefault,
    MyStyleCustom
};

2 つの州のみを表します。等しいかどうかをテストすることで簡単に確認できます。

switch (style){
    case MyStyleDefault:
        // int is 0
    break;
    case MyStyleCustom:
        // int is 1
    break;
}

ビットマスクはより多くの状態を表します。論理演算子またはビットごとの演算子を使用して個々のビットをチェックします。

typedef NS_OPTIONS(NSInteger, MyOption) {
    MyOption1 = 1 << 0, // bits: 0001
    MyOption2 = 1 << 1, // bits: 0010
};

if (option & MyOption1){ // last bit is 1
    // bits are 0001 or 0011
}
if (option & MyOption2){ // second to last bit is 1
    // bits are 0010 or 0011
}
if ((option & MyOption1) && (option & MyOption2)){ // last two bits are 1
    // bits are 0011
}

tl;dr enum は数値に名前を付けます。ビットマスクは、ビットに名前を付けます。

于 2014-01-27T15:23:33.363 に答える