2011-01-28 10 views
6

Ho una classe che eredita da NSObject. Utilizza un NSMutableArray per contenere oggetti figlio, ad es. Persone che utilizzano gli oggetti NSMutableArray * per conservare oggetti Person. Come posso implementare NSFastEnumerator sugli elementi?Implementazione di NSFastEnumeration sulla classe personalizzata

ho provato quanto segue ma non è valido:

@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

Che cosa è che si sta cercando di fare? Se usi solo [numero di array] puoi già contare sul conteggio, se vuoi ottenere il conteggio di alcuni tipi di oggetti nell'array che dovresti usare per (id object in array) <= che è l'enumerazione veloce –

+0

Ho un istanza sulla mia classe People nella mia delegata della app diciamo che voglio essere in grado di farlo: per (Persona * p in Persone) { NSLog (p); } – user593733

risposta

18

Non si sta utilizzando correttamente la struttura NSFastEnumerationState. Vedi NSFastEnumeration Protocol Reference e guarda la sezione costanti per vedere una descrizione di ciascuno dei campi. Nel tuo caso, devi lasciare state->mutationsPtr come zero. state->itemsPtr deve essere impostato su un array C degli oggetti, non su un NSArray o NSMutableArray. È inoltre necessario inserire gli stessi oggetti nell'array passato come stackbuf.

Tuttavia, dal momento che si sta utilizzando un NSMutableArray per contenere gli oggetti che si sta enumerando, si può solo inoltrare la chiamata a tale oggetto:

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

'inoltra semplicemente la chiamata a quell'oggetto' Ora, perché non ci ho pensato. Grazie! – user593733

+0

Il valore * mutationsPtr non dovrebbe essere memorizzato nella cache dal chiamante? \t Sarebbe più sicuro dichiarare-> mutationsPtr = & state-> extra [0]; se non sta ignorando NULL. –

1

C'è un protocollo NSFastEnumeration, ma si utilizza la (inesistente) NSFastEnumerator protocollo . Potrebbe essere il problema?

+0

Ho un'istanza sulla mia classe People nella mia delegata della app, diciamo che voglio essere in grado di farlo: per (Persona * p in Persone) { NSLog (p); } – user593733

Problemi correlati