2011-02-02 10 views
20

Tengo una clase y quiero que mi clase confirme el protocolo NSFastEnumeration. He leído la documentación, pero no está muy claro. ¿Puede alguien decirme por favor qué debe devolver el método de protocolo y cómo funciona? Gracias por adelantado.¿Alguien sabe cómo implementar el protocolo NSFastEnumeration?

+0

posible duplicado de [Construcción adecuada de la clase NSFastEnumeration] (http://stackoverflow.com/questions/3468349/proper-construction-of-nsfastenumeration-class) – outis

Respuesta

41

Apple FastEnumerationSample le muestra qué hacer, pero aquí hay un desglose.

El único método NSFastEnumeration, countByEnumeratingWithState:objects:count:, devuelve trozos de la colección. Se ejecuta cada vez que se necesitan más elementos, hasta que indica que no hay más elementos devolviendo 0. Se transfiere un fragmento como una matriz C de id s.

Dentro del método, el parámetro state contiene la mayoría (si no todos) de los datos que utilizará. Tendrá que establecer state->itemsPtr y actualizar state->state con cada invocación por separado de countByEnumeratingWithState:objects:count:. He aquí una breve descripción de cada campo de NSFastEnumerationState:

  • state: representa la posición en la secuencia que se repiten a lo largo. Para las colecciones indexadas, este sería el índice. Para listas vinculadas, esto podría ser un puntero de nodo. Para otros tipos, este podría ser un tipo más complejo (por ejemplo, para un árbol, state->state podría ser un NSMutableArray utilizado como pila para almacenar nodos). Cuando se llama por primera vez al countByEnumeratingWithState:objects:count:, state->state es 0; compruebe esta condición para inicializar la estructura state.
  • itemsPtr: los elementos en el fragmento; apunta a una matriz C de id s. Cocoa recorrerá esta matriz, vinculando cada elemento a la variable nombrada en el bucle for-in.
  • mutationsPtr: para colecciones mutables, utilizadas para indicar que la colección ha cambiado desde la última llamada al countByEnumeratingWithState:objects:count:. Normalmente, establecería esto una vez al inicializar el estado. Los mutadores de la colección incrementan el valor que esto apunta. Cocoa comparará el valor devuelto por countByEnumeratingWithState:objects:count: con el valor de la invocación anterior; si son diferentes, Cocoa lanzará una excepción.
  • extra: puede usar esto para almacenar datos adicionales.

Puede establecer state->state y cualquier elemento del state->extra a lo que quieran; se proporcionan únicamente para su conveniencia y no afectan a Cocoa. state->itemsPtr, *state->mutationsPtr y el valor devuelto por el método, sin embargo, afectan a Cocoa.

En cuanto a los otros dos parámetros de método, stackbuf es una matriz que Cocoa proporciona para contener elementos. Su uso es opcional, pero si no lo usa, tendrá que asignar espacio de almacenamiento para state->itemPtr. Si lo usa, establezca state->itemsPtr en stackbuf con cada invocación. len es la longitud de stackbuf, la cantidad máxima de elementos que podrá almacenar en ella.

Más información:

+0

¿le importaría al votante de baja importancia explicar por qué se hace referencia al código de muestra que contiene una implementación documentada que merece un voto negativo? el OP nunca mencionó leer la muestra. el autor del código de muestra pone más tiempo en el ejemplo que la típica respuesta SO. taaaaanks – justin

+0

dos errores no hacen un derecho ... (es decir, una mala respuesta ... para una mala pregunta). No te estoy votando hacia arriba o hacia abajo, ya que este tipo de respuesta es molestamente omnipresente. OMI, se debe asumir que los OP han leído la documentación oficial, siempre, y que hay algo "más allá" de lo que se dice en el " documentos oficiales "- que pueden ser elaborados aquí, o la pregunta debería ser rechazada. solo mi $ .02. –

+0

@alex no hay necesidad de suponer que el OP haya leído los documentos, eso está establecido en el PO. el OP no mencionó haber visto el código de muestra que explica y detalla este tema bastante bien. la concisión en mi respuesta me pareció apropiada porque habría tenido que destilar y repetir lo que la muestra ya explica. por supuesto, estos campos de comentarios y nuevas preguntas pueden formularse si se necesita más aclaración. considerando que la respuesta fue marcada como resuelta, y la cantidad de votos positivos, puede considerar que la respuesta es lo suficientemente buena en la dirección correcta para el caso general. (cont) – justin

Cuestiones relacionadas