objective-c cocoa fast-enumeration

objective c - ¿Cómo implementar el protocolo NSFastEnumeration?



objective-c cocoa (2)

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

El único método NSFastEnumeration , countByEnumeratingWithState:objects:count: devuelve fragmentos 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. Un fragmento se pasa como una matriz C de id s.

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

  • state : representa la posición en la secuencia sobre la que se itera. Para colecciones indexadas, este sería el índice. Para listas enlazadas, 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 usado como una pila para almacenar nodos). Cuando countByEnumeratingWithState:objects:count: se llama por primera vez, state->state es 0; Verifique esta condición para inicializar la estructura de state .
  • itemsPtr : los elementos en el fragmento; apunta a una matriz C de id s. Cocoa pasará sobre esta matriz, vinculando cada elemento a la variable nombrada en el bucle for-in.
  • mutationsPtr : para colecciones mutables, se usa para indicar que la colección ha cambiado desde la última llamada a countByEnumeratingWithState:objects:count: Normalmente, esto se establece una vez al inicializar el estado. Los mutadores de colección incrementan el valor al 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 utilizar esto para almacenar datos adicionales.

Puede establecer state->state y cualquier elemento de state->extra a lo que desee; 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, sí afectan a Cocoa.

En cuanto a los otros dos parámetros del 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 , el número máximo de elementos que podrás almacenar en él.

Otras lecturas:

Tengo una clase y quiero que mi clase confirme al Protocolo de NSFastEnumeration. He leído la documentación pero no está muy claro. ¿Alguien puede decirme qué método de protocolo debería devolver y cómo funciona?