Objective-C の typedef enum とは何ですか? 質問する

Objective-C の typedef enum とは何ですか? 質問する

enumが何なのか、いつ使用すべきなのかを根本的に理解していないと思います。

例えば:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

ここで実際に宣言されているのは何でしょうか?

ベストアンサー1

ここでは 3 つのことが宣言されています。匿名列挙型が宣言され、ShapeTypeその匿名列挙の typedef が宣言され、3 つの名前kCircle、、kRectangleおよびkOblateSpheroidが整数定数として宣言されています。

詳しく見てみましょう。最も単純なケースでは、列挙型は次のように宣言できます。

enum tagname { ... };

これは、タグ を持つ列挙を宣言しますtagname。C および Objective-C ( C++は除く) では、これへの参照の前に キーワードを付ける必要がありますenum。例:

enum tagname x;  // declare x of type 'enum tagname'
tagname x;  // ERROR in C/Objective-C, OK in C++

どこでもキーワードを使用する必要がないようにするにはenum、typedef を作成します。

enum tagname { ... };
typedef enum tagname tagname;  // declare 'tagname' as a typedef for 'enum tagname'

これは 1 行に簡略化できます。

typedef enum tagname { ... } tagname;  // declare both 'enum tagname' and 'tagname'

enum tagname最後に、キーワードを使用する必要がない場合は、匿名にして、typedef 名のみで宣言するenumことができます。enum

typedef enum { ... } tagname;

さて、この場合、 をShapeType匿名列挙の typedef された名前として宣言しています。ShapeTypeは実際には単なる整数型であり、宣言にリストされている値のいずれか (つまり、、、および のいずれか) を保持する変数を宣言するためにのみ使用する必要がありますkCirclekRectangleただし、キャストによって変数に別の値をkOblateSpheroid割り当てることができるShapeTypeため、列挙値を読み取るときは注意が必要です。

最後に、、、kCirclekRectangleグローバルkOblateSpheroid名前空間で整数定数として宣言されます。特定の値が指定されていないため、0 から始まる連続した整数に割り当てられます。つまり、kCircleは 0、kRectangleは 1、はkOblateSpheroid2 です。

おすすめ記事