31

最新のツールでは、新しい種類enumのが許可されるようになりました。

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

私の質問は部分的に来ます:

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

  2. なぜCarType2回表示されるのですか?最初の行をスキップしてCarType、最初の行を「typedef enum : NSUInteger {」のままにしてみましたが、問題なく動作しているようです。もしあれば、欠点は何ですか?

  3. 使用できる以外のタイプはNSUIntegerありますか?

4

6 に答える 6

37

この新しい方法は、オートコンプリート、switchステートメント、より正確な警告、...

マクロにこだわる...

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

...これを読んでください例えばhttps://stackoverflow.com/a/3190470/581190

NSInteger、...どのタイプが必要ですか?

于 2012-07-20T09:04:42.867 に答える
19
  1. これは、列挙型が使用する数値型を明示的に定義します。これは、移植性の懸念に役立ちます。また、署名付きと署名なしを制御する必要がある場合にも役立ちます

  2. ここでは実際に2つのタイプが定義されています。1つ目はenum CarTypeで、2つ目はCarTypeのエイリアスであるenum CarType。必要に応じて、最初の部分を省略できCarTypeます。enum CarTypeこれは、定義されたタイプになるのを防ぐだけですが、CarTypeそれでも有効です。人々が行うもう一つの一般的なことは次のようなものです

    typedef enum _EnumName {
        values
    } EnumName;
    

    ここで何をするかは、個人的な好みの問題です。

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

于 2012-07-20T08:59:31.943 に答える
4

大きな利点の1つは、次の構文で列挙型を前方宣言できることです。

enum CarType : NSUInteger;

これは、列挙型の定義のために、他のヘッダーに大きなヘッダーが含まれないようにするのに役立ちます。

于 2012-08-16T22:54:55.863 に答える
3

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

enumIdentとに同じ名前を使用することができますalias

于 2012-07-20T08:58:28.933 に答える
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 {してみましたが、問題なく動作しているようです。もしあれば、欠点は何ですか?

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

使用できる以外のタイプは NSUInteger ありますか?

うん、できます、タイプは常にNSIntegerです、あなたはそれらを制限する必要はありませんunsigned integer

于 2012-07-20T09:21:21.267 に答える
1

新しいNS_ENUMを使用すると、次のように前方宣言を行うこともできます。

// 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 */`

Objective-Cで列挙型を前方宣言します

于 2017-02-06T17:20:19.177 に答える