0

状況に応じて、NSArray または NSOrderedSet のいずれかになる可能性のある一連のオブジェクトを列挙しようとしています。どちらも NSFastEnumeration に準拠しているため、これが機能すると予想されます。

id<NSFastEnumeration> enumerableSet =
(test) ?
[NSArray arrayWithObjects:@"one", @"two", @"three", nil] :
[NSOrderedSet orderedSetWithObjects:@"one", @"two", @"three", nil];

NSEnumerator *e = [enumerableSet objectEnumerator];

ただし、次のコンパイラ エラーが発生します。

セレクター 'objectEnumerator' の既知のインスタンス メソッドはありません。

ここに構文エラーがあると思われます。これまで id 構造をあまり扱ったことがありません。セットの 1 つまたは両方を共通のクラスに変換することもできますが、可能であれば、ここで何が起こっているのかをよりよく理解したいと考えています。

4

3 に答える 3

4

objectEnumeratorNSFastEnumerationプロトコルで宣言され[enumerableSet objectEnumerator];ていないため、そのメソッドを定義していないタイプ「id」を使用しているため、使用は機能しません。

objectEnumeratorは NSArray および NSSet (共通のスーパー クラスを持たない) のプロパティとして宣言されているため、配列/セットであることを認識している変数から列挙子を設定する必要があります。すなわち:

NSEnumerator *e = 
(test) ?
[[NSArray arrayWithObjects:@"one", @"two", @"three", nil] objectEnumerator]:
[[NSOrderedSet orderedSetWithObjects:@"one", @"two", @"three", nil] objectEnumerator];
于 2012-09-03T16:32:43.697 に答える
1

分かった、気にしないで。私はちょうど私の答えを見つけました。objectEnumerator はプロトコルの一部ではないため、NSArray と NSOrderedSet の両方に objectEnumerator メッセージありますが、この方法では使用できません。代わりに、これはうまくいくようです:

NSEnumerator *e =
(test) ?
[[NSArray arrayWithObjects:@"one", @"two", @"three", nil] objectEnumerator]:
[[NSOrderedSet orderedSetWithObjects:@"one", @"two", @"three", nil] objectEnumerator];
于 2012-09-03T16:33:15.427 に答える