2012-07-20 2 views
30

の新しい列挙型、enum Sの新しい種類は、現在許可されています。最新のツールでのObjective-C

typedef enum CarType : NSUInteger { 
    FourDoorCarType, 
    TwoDoorCarType 
} CarType; 

は、私の質問は、部品に来る:

  1. は、なぜ私はこれを使用する必要があります古い方法の代わりに?

  2. なぜCarTypeが2回出現するのですか?私は最初のCarTypeをスキップし、最初の行をそのまま "typedef enum : NSUInteger {"としてみました。うまくいくようです。もしあれば、何が欠点ですか?

  3. NSUInteger以外のタイプを使用できますか?

+6

1に掲載の答えと同じ

// Forward declaration for XYZCharacterType in other header say XYZCharacter.h typedef NS_ENUM(NSUInteger, XYZCharacterType); // Enum declaration header: "XYZEnumType.h" #ifndef XYZCharacterType_h #define XYZCharacterType_h typedef NS_ENUM(NSUInteger, XYZEnumType) { XYZCharacterTypeNotSet, XYZCharacterTypeAgent, XYZCharacterTypeKiller, }; #endif /* XYZCharacterType_h */' 

を。私はこの機能について聞いていませんでした。 –

答えて

19
  1. これは、列挙型が使用する数値型を明示的に定義します。これは移植性の問題に役立ちます。また、符号付きと符号なしの両方を制御する必要がある場合にも役立ちます。

  2. 2つのタイプが実際にここで定義されています。最初はenum CarType、次はCarType、別名はenum CarTypeです。必要に応じて、最初のCarTypeを省略することができます。これにより、enum CarTypeが定義された型になるのを防ぎますが、CarTypeは依然として有効です。人々が行うもう1つの共通のことは、次のようなものです。

    typedef enum _EnumName { 
        values 
    } EnumName; 
    

    ここで行うことは、個人的な好みの問題です。

  3. はい。列挙型の値は、選択した型に収まる必要がありますが、任意の数値型を使用できます。

+0

アンダースコアで始まり大文字で始まる識別子は、実装用に予約されています。 – dreamlax

+0

私はアンダースコアの代わりに 't'( 'tag'のために)を使用します:typedef enum tMyEnum {...} MyEnum; –

+0

この新しいメソッドではfloat/doubleを使用できますか? –

3

ポイント2の場合:C:typedef <something> <alias>の「同じ古い構文」です。ここで、somethingenum <enumIdent> { <a, b, c, d, ...> }です。

enumIdentaliasに同じ名前を使用することは許可されています。

37

...この新しい方法は、自動補完、switch文、より良い、それぞれより正確な警告であなたを助けるのでスティックマクロ...

typedef NS_ENUM(NSUInteger, CarType) { 
    FourDoorCarType, 
    TwoDoorCarType 
}; 

と...続きを読みますこれはたとえばhttps://stackoverflow.com/a/3190470/581190

NSInteger、どのようなタイプが欲しいですか?

+0

*オートコンプリート、スイッチのステートメント、または警告はどのように役立ちますか? –

+0

このマクロを使用してenumを定義すると、たとえばswitch文ですべてのケースを処理しないという警告が表示されます。あなたが 'case FourDoorCarType:'だけでswitch文を持っているとしましょう。 'TwoDoorCarType'などを扱わないことを警告します。 – robertvojta

1

ここに回答があります。

typedef enum MYCARTYPE { // you could drop the ": NSInteger" part to you could drop the the MYCARTYPE name as well, if you like. 
    FourDoorCarType, 
    TwoDoorCarType 
} CarType; 

これは古い方法の代わりに使用するのはなぜですか?

現在の段階では古い方法を使用できます。

なぜCarTypeが2回出現するのですか?私は最初にCarTypeをスキップして、ちょうどtypedef enum : NSUInteger {としています。うまくいくようです。もしあれば、何が欠点ですか?

あなたはCarTypeとしてenumを命名して、あなたにもCarTypeとしてtypedef定義における新しいタイプの名前からです。 enumに名前を付ける必要はありません。その名前をどこにでも使用することはできません。新しいタイプの名前で十分です。

NSUInteger以外のタイプを使用できますか?

あなたは、タイプは常にNSIntegerです。unsigned integerを制限する必要はありません。理由だけで列挙型の定義の他のヘッダに大きなヘッダを含む回避に役立ちます

enum CarType : NSUInteger; 

を:

+0

2つのアンダースコアで始まる識別子は予約されているので、使用しないでください。同様に、アンダースコアと大文字で始まる識別子も予約されています。 – dreamlax

+0

あなたは部分的に正しいですが、この種の名前は**本当に**予約されています: '__MATH__'ですが、2つのアンダースコアで始まる他のIDの場合は規約がないので、' __MATH'のように使用できます。 – holex

+2

いいえ、私は完全に正しいです、C標準§7.1.3はこう書いています:*アンダースコアと大文字または別のアンダースコアで始まるすべての識別子は常に使用のために予約されています* – dreamlax

3

一つの大きな利点は、あなたがこの構文で列挙型を転送-宣言することができるということです。

関連する問題