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). CuandocountByEnumeratingWithState:objects:count:
se llama por primera vez,state->state
es 0; Verifique esta condición para inicializar la estructura destate
. -
itemsPtr
: los elementos en el fragmento; apunta a una matriz C deid
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 acountByEnumeratingWithState: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 porcountByEnumeratingWithState: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:
- Preguntas y respuestas del viernes 2010-04-16: Implementación de la enumeración rápida (mikeash.com)
- Implementando countByEnumeratingWithState: objects: count: (Cocoa with Love)
- Referencia del protocolo NSFastEnumeration
- Implementación de NSFastEnumerator en la clase personalizada (SO)
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?
Simplemente reviviendo este hilo después de encontrar una excelente explicación. El enlace de Apple parece estar roto. Puedes probar aquí: https://developer.apple.com/library/ios/#samplecode/FastEnumerationSample/Introduction/Intro.html
El mejor ejemplo para implementar la enumeración rápida que he encontrado está en: http://mikeash.com/pyblog/friday-qa-2010-04-16-implementing-fast-enumeration.html . Se ve mucho peor de lo que es.