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?
Respuesta
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 alcountByEnumeratingWithState:objects:count:
,state->state
es 0; compruebe esta condición para inicializar la estructurastate
.itemsPtr
: los elementos en el fragmento; apunta a una matriz C deid
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 alcountByEnumeratingWithState: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 porcountByEnumeratingWithState: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:
¿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
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. –
@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
Sólo la reactivación de este hilo después de encontrar una excelente explicación. El enlace de Apple parece estar roto. Puede intentar 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.
- 1. ¿Alguien sabe el estado actual de Graphics32?
- 2. Android: ¿Alguien sabe cómo capturar video?
- 3. ¿Alguien sabe cómo utilizar PagerTitleStrip en Android
- 4. fsi.exe Ensamblaje: ¿Alguien sabe cómo incrustarlo?
- 5. virtualenv, mysql-python, pip: ¿alguien sabe cómo?
- 6. ¿Alguien sabe cómo google Analytics procesa datos?
- 7. ¿Alguien sabe cómo habilitar ARM FIQ?
- 8. ¿Alguien sabe qué significa advapi?
- 9. ¿Alguien sabe cómo getWindow() en el servicio en Android?
- 10. ¿Alguien sabe cómo funciona el diseño de Pinterest.com?
- 11. ¿Cómo implementar un protocolo de red?
- 12. ¿Alguien sabe algo acerca de OLAP Internals?
- 13. ¿Alguien sabe de un generador de paquetes?
- 14. ¿Alguien sabe algún buen tutorial de silverlight?
- 15. ¿Alguien sabe de alguna colección de sprites?
- 16. ¿Alguien sabe algo como RSPec para PHP?
- 17. ¿Alguien sabe algún tutorial stm32 muy básico?
- 18. Cómo definir e implementar propiedades en el protocolo
- 19. ¿Alguien sabe de un buen explorador OData?
- 20. ¿Alguien sabe para qué usa Flash Gmail?
- 21. Alguien sabe qué tumblr está escrito en
- 22. ¿Alguien sabe qué hace "mov edi, edi"?
- 23. ¿Alguien sabe qué significa el fragmento de código a continuación?
- 24. ¿Alguien sabe dónde obtener el código real de Cray PVP?
- 25. ¿Alguien sabe bien el tutorial Object Constraint Language (OCL)?
- 26. ¿Alguien sabe lo que significa que el mensaje ShellHook HSHELL_RUDEAPPACTIVATED?
- 27. ¿Alguien sabe cómo pegar como comentario en VS2010?
- 28. ¿Alguien sabe cómo B-Tree obtuvo su nombre?
- 29. ¿Alguien sabe cómo cambiar dinámicamente los modos con CodeMirror?
- 30. ¿Alguien sabe cómo escribir un Apple Push Notification Provider en C#?
posible duplicado de [Construcción adecuada de la clase NSFastEnumeration] (http://stackoverflow.com/questions/3468349/proper-construction-of-nsfastenumeration-class) – outis