2011-02-02 17 views
20

Ho una classe e voglio che la mia classe confermi il protocollo NSFastEnumeration. Ho letto la documentazione ma non è chiaro. Qualcuno può dirmi cosa deve restituire il metodo del protocollo e come funziona? Grazie in anticipo.Qualcuno sa come implementare il protocollo NSFastEnumeration?

+0

possibile duplicato di [Costruzione corretta della classe NSFastEnumeration] (http://stackoverflow.com/questions/3468349/proper-construction-of-nsfastenumeration-class) – outis

risposta

41

Apple FastEnumerationSample mostra cosa fare, ma ecco un guasto.

L'unico metodo NSFastEnumeration, countByEnumeratingWithState:objects:count:, restituisce blocchi della raccolta. Viene eseguito ogni volta che sono necessari più elementi, finché non indica che non ci sono più elementi restituendo 0. Un blocco viene passato come un array C di id s.

All'interno del metodo, il parametro state contiene la maggior parte (se non tutti) dei dati che verranno utilizzati. È necessario impostare state->itemsPtr e aggiornare state->state con ciascuna chiamata separata di countByEnumeratingWithState:objects:count:. Ecco una breve descrizione di ciascun campo di NSFastEnumerationState:

  • state: rappresenta la posizione nella sequenza essendo iterata. Per le collezioni indicizzate, questo sarebbe l'indice. Per gli elenchi collegati, questo potrebbe essere un puntatore del nodo. Per altri tipi, questo potrebbe essere un tipo più complesso (ad esempio per un albero, state->state potrebbe essere un NSMutableArray utilizzato come stack per memorizzare i nodi). Quando viene chiamato per la prima volta countByEnumeratingWithState:objects:count:, state->state è 0; controllare questa condizione per inizializzare la struttura state.
  • itemsPtr: gli articoli nel blocco; punta a un array C di id s. Cocoa eseguirà il loop su questa matrice, vincolando a turno ciascuna voce alla variabile denominata nel ciclo for-in.
  • mutationsPtr: per raccolte mutabili, utilizzato per indicare che la raccolta è stata modificata dall'ultima chiamata a countByEnumeratingWithState:objects:count:. In genere, l'avresti impostato una volta durante l'inizializzazione dello stato. I mutatori di raccolta incrementano il valore a cui questo punta. Cocoa confronterà il valore restituito da countByEnumeratingWithState:objects:count: al valore della precedente chiamata; se sono diversi, Cocoa farà un'eccezione.
  • extra: è possibile utilizzare questo per memorizzare dati aggiuntivi.

È possibile impostare state->state e qualsiasi elemento di state->extra in base alle proprie esigenze; sono forniti esclusivamente per la vostra comodità e non influenzano il cacao. state->itemsPtr, *state->mutationsPtr e il valore restituito dal metodo, tuttavia, influisce sul cacao.

Come per gli altri due parametri del metodo, stackbuf è una matrice che Cocoa fornisce per contenere gli elementi. Il suo utilizzo è facoltativo, ma se non lo utilizzi, dovrai allocare spazio di archiviazione per state->itemPtr. Se lo usi, imposta state->itemsPtr su stackbuf ad ogni chiamata. len è la lunghezza di stackbuf, il numero massimo di elementi che sarà possibile memorizzare al suo interno.

Ulteriori approfondimenti:

+0

il down-elettore si preoccuperà di spiegare perché fare riferimento al codice di esempio che contiene un'implementazione documentata degna di un down-vote? l'OP non ha mai menzionato la lettura del campione. l'autore del codice di esempio inserisce più tempo nell'esempio della tipica risposta SO. taaaaanks – justin

+0

due torti non fanno bene ... (cioè una brutta risposta ... per una brutta domanda). non sto votando su o giù, dato che questo tipo di risposta è fastidiosamente pervasivo .. IMO, si dovrebbe presumere che gli OP hanno letto la documentazione ufficiale, sempre, e o c'è qualcosa "oltre" ciò che è affermato nella " documenti ufficiali "- che possono essere elaborati, qui ... o la domanda dovrebbe essere votata. solo il mio $ .02. –

+0

@alex non è necessario presumere che l'OP abbia letto i documenti, come indicato nell'OP. l'OP non ha menzionato il fatto di aver visto il codice di esempio che spiega e dettaglia questo argomento abbastanza bene. la chiarezza nella mia risposta mi sembrava appropriata perché avrei dovuto distillare e ripetere ciò che il campione già spiega. naturalmente, questi campi di commento e nuove domande possono essere chiesti se sono necessari ulteriori chiarimenti. considerando che la risposta è stata contrassegnata come risolta e il numero di voti positivi, potresti considerare la risposta una spinta abbastanza buona nella direzione giusta per il caso generale. (segue) – justin

Problemi correlati