5

より強力な型チェックのために導入された新しいNS_ENUMマクロで列挙型を宣言した場合、実行時にもこの型をチェックできますか?

つまり、私は持っています

typedef NS_ENUM(NSUInteger, MyNewType) {

    MyNewTypeInstance1,
    MyNewTypeInstance2,
    MyNewTypeInstance3

};

。そして、私は、例えば(NSUInteger)i = 2、一種のことを知りたいですMyNewType

4

2 に答える 2

7

いいえ。NS_ENUMこれは、C ++ 11を介してObjective-Cに導入された、列挙用の「固定基になる型」​​と呼ばれる機能を使用する方法にすぎません。これにより、列挙値の格納に使用される型が固定サイズと符号付きであることが保証されますが、実行時に列挙型について問い合わせることはできません。

値が実際に列挙のメンバーであるかどうかを検証することに関心がある場合は、それに関連する2つのアプローチがあります。値が連続している場合は、問題の値が有効な連続範囲内にあるかどうかをチェックするマクロを作成できます。それ以外の場合は、Appleが採用しているより一般的な(そして冗長な)アプローチ(UIDeviceOrientationIsValidInterfaceOrientationなど)を使用して、すべての有効な列挙値を明示的にチェックできます。

于 2012-11-20T16:02:02.823 に答える
0

@warrenm:良い答え

私はこれについて考えていました:

ある種の「myLastValueJustToCheck」を追加して、intがその値未満であるかどうかを確認するのはどうですか?

typedef NS_ENUM(NSUInteger, MyNewType) {
    MyNewTypeInstance1,
    MyNewTypeInstance2,
    MyNewTypeInstance3,
    myLastValueJustToCheck
};

次に確認します。

NSUInteger i = 2;
NSLog(@"is %i i in my range? %i", i, (i<myLastValueJustToCheck));

i = 3;
NSLog(@"is %i i in my range? %i", i, (i<myLastValueJustToCheck));

i = 4;
NSLog(@"is %i i in my range? %i", i, (i<myLastValueJustToCheck));
于 2012-11-20T16:34:09.460 に答える