¿Puede enumerar rápidamente un NSIndexSet
? si no, ¿cuál es la mejor manera de enumerar los elementos en el conjunto?Enumeración rápida en un NSIndexSet
Respuesta
La enumeración rápida debe producir objetos; dado que un NSIndexSet contiene números escalares (NSUInteger
s), no objetos, no, no se puede enumerar rápidamente un conjunto de índices.
Hipotéticamente, podría empaquetarlos en NSNumbers, pero entonces no sería muy rápido.
Un ciclo while debería ser el truco. Incrementa el índice después de usar el índice anterior.
/*int (as commented, unreliable across different platforms)*/
NSUInteger currentIndex = [someIndexSet firstIndex];
while (currentIndex != NSNotFound)
{
//use the currentIndex
//increment
currentIndex = [someIndexSet indexGreaterThanIndex: currentIndex];
}
Los índices válidos pueden exceder el rango de valores representables por 'int', ya que los índices no están firmados. Además, cuando se dirige a una plataforma de 64 bits o compila con 'NS_BUILD_32_LIKE_64' definido, el índice es un valor de 64 bits. Utilice 'NSUInteger' en lugar de' int' para que coincida con el tipo almacenado por 'NSIndexSet' en todas las plataformas. –
@Jeremy W. Sherman: en realidad los índices están efectivamente limitados a los valores que pueden ser representados por un ** NSInteger ** ** positivo porque el valor de retorno "no encontrado" es 'NSNotFound' que es lo mismo que' NSIntegerMax' – JeremyP
@Evan: este ejemplo sigue siendo incorrecto. La comparación en el ciclo while debe estar en contra de 'NSNotFound' * not * -1. – JeremyP
En OS X 10.6+ y SDK de iOS 4.0 o superior, puede utilizar el mensaje -enumerateIndexesUsingBlock:
:
NSIndexSet *idxSet = ...
[idxSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
//... do something with idx
// *stop = YES; to stop iteration early
}];
Cambiar NSInteger a NSUInteger – cocoafan
¡Esta es la respuesta correcta! – jaredsinclair
Esta es la respuesta real, ¿puede cambiar? – Jameson
Respuesta corta: no. NSIndexSet
no se ajusta al <NSFastEnumeration>
protocol.
¿qué hay de enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * stop) {} --- ¿no es una enumeración rápida? –
Suponiendo que tenemos un ejemplar NSTableView
(vamos a llamarlo *tableView
), puede eliminar varias filas seleccionadas de la fuente de datos (uhm .. *myMutableArrayDataSource
), usando:
[myMutableArrayDataSource removeObjectsAtIndexes:[tableView selectedRowIndexes]];
[tableView selectedRowIndexes]
devuelve un NSIndexSet
. No es necesario que comience a enumerar los índices en el NSIndexSet
usted mismo.
Este es un punto impresionante acerca de 'NSMutableArray', gracias. –
Esto no responde realmente a la pregunta, sino que dice "quizás no necesites hacer esa pregunta para empezar. ¿Para qué quieres esta enumeración rápida?" –
- 1. NSIndexSet "-indexAtIndex:"?
- 2. Enumeración rápida en NSArray de diferentes tipos
- 3. Enumeración rápida Vs NSEnumerator en Objective-C
- 4. Mantenga un registro de índice en la enumeración rápida
- 5. Enumeración rápida con un NSMutableArray que contiene un NSDictionary
- 6. ¿Cómo se detiene la enumeración rápida?
- 7. NSIndexSet de NSArray
- 8. Cómo usar NSIndexSet
- 9. Objective-C enumerateUsingBlock versus enumeración rápida?
- 10. ¿Cómo obtener índices de NSIndexset en un NSArray en cacao?
- 11. Enumeración rápida en una categoría NSArray para NSIntegers
- 12. Ejemplo de adopción/implementación de enumeración rápida para mi clase?
- 13. Cocoa NSArray/NSSet: -makeObjectsPerformSelector: frente a la enumeración rápida
- 14. Enumeración Ámbito
- 15. Get enumeración de atributos enumeración
- 16. ¿Cuál es la diferencia entre NSIndexSet y NSSet?
- 17. enumeración extern en C++
- 18. Conmutación enumeración en FreeMarker
- 19. Javascript enumeración dentro de una enumeración
- 20. Enumeración de NSArray múltiple
- 21. Display Descripción Enumeración de jqGrid en lugar de la enumeración
- 22. banderas enumeración en JavaScript
- 23. enumeración formato en gridview
- 24. Objetivo C: ¿El último objeto cuando se usa la enumeración rápida?
- 25. multiplicación de enteros rápida/rápida en ruby?
- 26. Objetivo c "para cada uno" (enumeración rápida) - evaluación de la colección?
- 27. ARC error Enumeración propiedad Fuerte
- 28. Manera rápida de verificar un rango de valores enum
- 29. Enumeración del diccionario en C#
- 30. Cadena de enumeración en C++
No me importa el golpe de rendimiento, pero tendrías que retrasar enumerar antes de enumerar rápido, ¿verdad? –
Con punteros etiquetados (en plataformas de 64 bits desde OS X 10.7 e iOS 5), la enumeración rápida de 'NSIndexSet' debería ser bastante rápida. –