2011-01-28 13 views
6

私はNSObjectから継承するクラスを持っています。子オブジェクトを保持するためにNSMutableArrayを使用します。 Personオブジェクトを保持するためにNSMutableArray *アイテムを使用する人。アイテムにNSFastEnumeratorを実装するにはどうすればよいですか?カスタムクラスでNSFastEnumerationを実装する

私は次のことを試してみましたが、それは無効です。

@interface People : NSObject <NSFastEnumeration> 
{ 
    NSMutableArray *items; 
} 

@implementation ...

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len 
{ 
    if(state->state == 0) 
    { 
     state->mutationsPtr = (unsigned long *)self; 
     state->itemsPtr = items; 
     state->state = [items count]; 
     return count; 
    } 
    else 
     return 0; 
} 
+0

それはあなたがやろうとしていることは何ですか? [配列数]を使用するだけであれば、配列内の特定の型のオブジェクトの数を取得したい場合は(配列内のidオブジェクト)<=高速列挙型 –

+0

私はアプリケーションの代理人の私のPeopleクラスのインスタンスは、これを行うことができるとしましょう: for(Person * p in People){ NSLog(p); } – user593733

答えて

18

NSFastEnumerationState構造体を適切に使用していません。 NSFastEnumeration Protocol Referenceを参照し、各フィールドの説明を参照するには定数セクションを参照してください。あなたの場合、state->mutationsPtrはゼロのままにしておきます。 state->itemsPtrは、NSArrayまたはNSMutableArrayではなく、オブジェクトのC配列に設定する必要があります。 stackbufとして渡された配列に同じオブジェクトを配置する必要もあります。

しかし、あなたが列挙されているオブジェクトを含むようにNSMutableArrayのを使用しているので、あなただけの、そのオブジェクトにコールを転送できます。

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len { 
    return [items countByEnumeratingWithState:state objects:stackbuf count:len]; 
} 
+2

'そのオブジェクトへの呼び出しを転送するだけです。'なぜ私はそれについて考えなかったのですか?ありがとう! – user593733

+0

* mutationsPtrは呼び出し元によってキャッシュされませんか? \t state-> mutationsPtr =&state-> extra [0];より安全でしょうか? NULLを無視していない場合。 –

1

ありNSFastEnumerationプロトコルだが、あなたは(存在しない)NSFastEnumeratorプロトコルを使用しています。それが問題だろうか?

+0

私は、アプリケーションの代理人の私のPeopleクラスのインスタンスを持っています。これを行うには、次のようにします: for(Person * in People){ NSLog(p); } – user593733

関連する問題