2011-11-30 8 views
6

Estoy intentando utilizar NSRange a cabo una serie de años, comobucle utilizando NSRange

NSRange years = NSMakeRange(2011, 5); 

NSRange se utiliza sobre todo para el filtrado, sin embargo quiero bucle sobre los elementos de la gama. ¿Es eso posible sin convertir el NSRange en un NSArray?

Respuesta

8

En cierto modo parece que estás esperando NSRange a ser como un range objeto Python. No es; NSRange es simplemente una estructura

typedef struct _NSRange { 
     NSUInteger location; 
     NSUInteger length; 
} NSRange; 

no un objeto. Una vez que haya creado uno, puede utilizar sus miembros en una llanura de edad for bucle:

NSUInteger year; 
for(year = years.location; year < NSMaxRange(years); year++){ 
    // Do your thing. 
} 

(Sigue trabajando en el supuesto de que usted está pensando en Python.) Hay sintaxis en ObjC llama fast enumeration para iterar sobre el contenido de un NSArray que es gratamente similar a un bucle de Python for, pero como los números literales y primitivos no se pueden poner en un NSArray, no se puede pasar directamente de NSRange a una matriz de Cacao.

Una categoría podría hacer que más fácil, sin embargo:

@implementation NSArray (WSSRangeArray) 

+ (id)WSSArrayWithNumbersInRange:(NSRange)range 
{ 
    NSMutableArray * arr = [NSMutableArray array]; 
    NSUInteger i; 
    for(i = range.location; i < NSMaxRange(range); i++){ 
     [arr addObject:[NSNumber numberWithUnsignedInteger:i]]; 
    } 

    return arr; 
} 

continuación, puede crear una matriz y utilizar la enumeración rápida:

NSArray * years = [NSArray WSSArrayWithNumbersInRange:NSMakeRange(2011, 5)]; 
for(NSNumber * yearNum in years){ 
    NSUInteger year = [yearNum unsignedIntegerValue]; 
    // and so on... 
} 
+0

gracias, lástima que no hay soporte para la enumeración rápida de NSRange. podría ahorrarme algo de tiempo y líneas de código – aporat

+0

@manroe: Agradezco la corrección de mi error de codificación, pero el gran bloque "EDITAR:" fue inapropiado; podría haber sido un comentario, el resumen de edición, o simplemente haber quedado en blanco por completo. –

6

Recuerde que un NSRange es una estructura que contiene dos enteros, que representa el inicio y la longitud del rango. Puede recorrer fácilmente todos los enteros contenidos utilizando un ciclo for.

NSRange years = NSMakeRange(2011, 5); 
NSUInteger year; 
for(year = years.location; year < years.location + years.length; ++year) { 
    // Use the year variable here 
} 
3

Esto es un poco de una vieja pregunta, pero una alternativa usar un NSArray sería crear un NSIndexSet con el rango deseado (usando indexWithIndexesInRange: o initWithIndexesInRange:) y luego usar la enumeración de bloques como en https://stackoverflow.com/a/4209289/138772. (Parecía relevante ya que solo estaba comprobando esto yo mismo.)

0

Mi solución alternativa para esto fue definir una macro solo para hacer que la abreviatura sea más rápida.

#define NSRangeEnumerate(i, range) for(i = range.location; i < NSMaxRange(range); ++i) 

Llamarlo usted:

NSArray *array = @[]; // must contain at least the following range... 
NSRange range = NSMakeRange(2011, 5); 
NSUInteger i; 
NSRangeEnumerate(i, range) { 
    id item = array[i]; 
    // do your thing 
} 

personalmente Todavía estoy tratando de averiguar cómo puedo escribir la macro por lo que sólo se puede llamar como:

NSRangeEnumerate(NSUInteger i, range) { 

} 

cuales no es compatible por el momento ... espero que ayude o haga que escribir su programa sea más rápido

Cuestiones relacionadas