enums enum 数値 - Objective-Cのtypedef列挙型とは何ですか?





7 Answers

AppleはXcode 4.4以来このような列挙型を定義することを推奨しています:

typedef enum ShapeType : NSUInteger {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

彼らはまた便利なマクロNS_ENUMを提供します:

typedef NS_ENUM(NSUInteger, ShapeType) {
    kCircle,
    kRectangle,
    kOblateSpheroid
};

これらの定義は、より強力な型チェックと優れたコード補完を提供します。 NS_ENUMの公式文書は見つかりませんでしたが、WWDC 2012セッションの「Modern Objective-C」ビデオをhere見ることができhere

UPDATE: hereに公式文書へのリンク。

int 変換 モダン

私はenumが何であるか、そしてそれをいつ使用するのかを根本的に理解しているとは思わない。

例えば:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

ここに本当に何が宣言されていますか?




可能な値がkCirclekRectangle 、またはkOblateSpheroidのユーザー定義型。 enum内の値(kCircleなど)は列挙型の外側に表示されます。 そのことを念頭に置くことが重要です( int i = kCircle;など)。




Enumはユーザー定義のデータ型です。 ENUMERATED DATA TYPES列挙型データ型変数は、以前に宣言された値のみを取ります。

enum month { jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec };
enum month this_month;

this_month = feb;

上記の宣言では、monthは列挙型として宣言されています。 これは、janからdecの値のセットで構成されます。 数値的に、janには値1が与えられ、febには値2が与えられます。

変数this_monthは月と同じ型で宣言され、febに関連付けられた値が割り当てられます。 This_monthには、月の宣言の初期化リストで指定された値以外の値を割り当てることはできません。




typedefは、既存の変数型の名前を再定義するのに便利です。 これは、データ型を呼び出すための簡潔で意味のある方法を提供します。 例えば:

typedef unsigned long int TWOWORDS;

ここでは、unsigned long int型はTWOWORDS型に再定義されています。 このようにして、unsigned long int型の変数を書くことができます。

TWOWORDS var1, var2;

の代わりに

unsigned long int var1, var2;



enumは、structで行うことができないenum要素に値を代入するために使用されます。 だから毎回、完全な変数にアクセスするのではなく、列挙型の変数に割り当てる値で行うことができます。 デフォルトでは、割り当ては0で始まりますが、任意の値を割り当てることができ、列挙の次の変数には前の値+1の値が割り当てられます。




TypedefはCおよびC ++のキーワードです。 基本データ型(char、int、float、double、struct&enum)の新しい名前を作成するために使用されます。

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

ここでは、列挙型のShapeTypeを作成し 、以下に示すように、列挙型ShapeTypeの新しい名前を記述することができます

ShapeType shape1; 
ShapeType shape2; 
ShapeType shape3;



enumは多くのタイプの "エラー"を減らし、コードをより管理しやすくします

#define STATE_GOOD 0
#define STATE_BAD 1
#define STATE_OTHER 2
int STATE = STATE_OTHER

定義に制約はありません。 それは単なる代替物です。 状態のすべての条件を制限することはできません。 STATEが5に割り当てられている場合、一致するステートがないため、プログラムは間違っています。 しかし、コンパイラはSTATE = 5に警告するつもりはない

だから、このように使う方が良いです

typedef enum SampleState {
    SampleStateGood  = 0,
    SampleStateBad,
    SampleStateOther
} SampleState;

SampleState state = SampleStateGood;



Related