値のセットを列挙型に割り当て、変数が目的の c のその列挙型に値を持っているかどうかを確認する方法はありますか? オブジェクトが配列に存在する場合、配列内のオブジェクトのインデックスを取得するようなものです。テーブルビューで特定のインデックス(順番になっていない可能性があります)がタップされたときに、すべてのインデックスのif-ingを避けたい場合、列挙型スタイルを使用できることを願っています。
3 に答える
Objective-C は、ほとんどのプログラミング言語と同様に、プリミティブ型 (オブジェクト型 (例: ) のみ) の「型メンバーシップ」テストを提供しないため、isKindOfClass:を使用してenumも問題は解決しません。
ただしenum、最初に を考えていることを考えると、確認したい小さな固定値セットがあるように思えます。その場合、次のような静的配列を使用できます。
static NSUInteger indices[] = { 2, 42, 57 };
このような配列の値の数は で与えられsizeof(indices) / sizeof(NSUInteger、メンバーシップをテストする単純なループまたは二分探索を記述できます。
オブジェクトを使用したい場合は thenNSSetが良い選択です。実行中に数値が変わる場合はNSMutableSet. 例えば
NSSet *indices = [NSSet setWithObjects:@2, @42, @57, nil];
そして、次を使用してメンバーシップをテストしますmember:。
if ([indices member:@indexToTest] != nil) ...
(注: NSArrayfor の仕様とは異なり、 containsObject:forはを使用するとは言ってNSSetいないisEqual:ため、member:ここでは を使用します。)
enumそれらを列挙したり、sth を呼び出したりできないため、そのためにan を使用することはできません。それらのようcontainsに。私があなたを正しく理解していれば、それを行う簡単な方法は、NSArray気になるインデックスを格納するために an を使用することだと思います。インデックス 2、6、および 14 を認識したいとします。
NSArray *indices = [NSArray arrayWithObjects: @2, @6, @14, nil];
( @NSArray はオブジェクトしか格納できないため、 が必要です。@は整数をNSNumberインスタンスに変換します。
次に、現在選択されているインデックスがその中にあるかどうかを確認するには、次を使用します。
int indexToCheck = ...;
BOOL indexIsInArray = [index containsObject:@(indexToCheck)];
より「派手な」(そしてより高速な)方法を探している場合は、ビット操作を使用できます(例として2、6、および14を使用):
int indices = 1 << 2 | 1 << 6 | 1 << 14;
次に確認します。
int indexToCheck = ...;
BOOL isValid = (1 << indexToCheck) & indices;
あなたの_ isValid_indexToCheckindices
いいえ、内部的に列挙型は整数に基づいており、マッピングはコンパイル時に行われます。そのため、列挙型ごとに特定のチェックが必要です (連続した数字の場合は、">" と "<" のチェックで十分です)。