2012-08-03 6 views
6

Python puede hacer una lista con los números continuos así:números continuos en la matriz de Objective-C como la gama() en Python

numbers=range(1,10); // >> [1,2,3,4,5,6,7,8,9] 

cómo implementar esto en Objective-C?

+0

¿Para qué necesitas esta gama? – holex

+0

@holex Solo necesito una matriz con números continuos, no quiero iniciarla con un bucle. – Mil0R3

+0

, entonces es muy difícil saber qué solución es la mejor para usted. la solución genérica es iniciar una matriz con un bucle y puede usar esa matriz para todo, pero habrá otros trucos más elegantes para casos especiales, pero no sabemos nada sobre su objetivo final. – holex

Respuesta

10

La lectura de su declaración " sólo necesitan una matriz con números continuos, no quiero a init con un bucle" me permite preguntar: ¿qué es más importante para usted: tener una array o tener "algo" que representa un rango continuo de números (naturales). Eche un vistazo a NSIndexSet Puede acercarse a lo que quiera. Inicializar con

[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1,9)]; 

interactuando sobre este conjunto es tan simple como la iteración en una matriz y no necesita NSNumbers.

5

Objective-C (o Foundation en realidad) no tiene una función especial para esto. Se podría utilizar:

NSMutableArray *array = [NSMutableArray array]; 
for(int i=1; i<10; i++) { 
    [array addObject:@(i)]; // @() is the modern objective-c syntax, to box the value into an NSNumber. 
} 
// If you need an immutable array, add NSArray *immutableArray = [array copy]; 

Si desea utilizar más a menudo que podría opcionalmente ponerlo en un category.

+0

Sí, también lo utilicé de esta manera, solo quiero encontrar una forma un poco simple. – Mil0R3

+0

Cuando puse la edición, si la usa más a menudo puede crear una categoría (enlace en respuesta) que le permita hacer: [NSArray arrayWithNumbersFrom: 1 to: 10]; –

+0

@ Veeliano ¿Por qué no ajustar el código anterior en un método y ponerlo en una categoría en 'NSArray'? La firma sería algo así como '- (NSArray *) arrayWithRangeFrom: (int) start to: (int) stop step: (int) step;' – JeremyP

4

Puede usar NSRange.

NSRange numbers = NSMakeRange(1, 10); 

NSRange es simplemente una struct y no como un Python gama objeto.

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

Así que hay que utilizar para bucle para acceder a sus miembros.

NSUInteger num; 
for(num = 1; num <= maxValue; num++){ 
    // Do Something here 
} 
1

Puede subclase NSArray con una clase para rangos. Subclases NSArray es bastante simple:

  • se necesita un método de inicialización adecuada, que exige [super init]; y

  • Necesita anular count y objectAtIndex:

se puede hacer más, pero usted no necesita. Aquí está un boceto falta algún código de comprobación:

@interface RangeArray : NSArray 

- (id) initWithRangeFrom:(NSInteger)firstValue to:(NSInteger)lastValue; 

@end 

@implementation RangeArray 
{ 
    NSInteger start, count; 
} 

- (id) initWithRangeFrom:(NSInteger)firstValue to:(NSInteger)lastValue 
{ 
    // should check firstValue < lastValue and take appropriate action if not 
    if((self = [super init])) 
    { 
     start = firstValue; 
     count = lastValue - firstValue + 1; 
    } 
    return self; 
} 

// to subclass NSArray only need to override count & objectAtIndex: 

- (NSUInteger) count 
{ 
    return count; 
} 

- (id)objectAtIndex:(NSUInteger)index 
{ 
    if (index >= count) 
     @throw [NSException exceptionWithName:NSRangeException reason:@"Index out of bounds" userInfo:nil]; 
    else 
     return [NSNumber numberWithInteger:(start + index)]; 
} 

@end 

Usted puede utilizar esto como sigue:

NSArray *myRange = [[RangeArray alloc] initWithRangeFrom:1 to:10]; 

Si copy un RangeArray se convertirá en una matriz normal de NSNumber objetos, pero se puede evitar si desea implementar los métodos de protocolo NSCopying.

Cuestiones relacionadas