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?
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?
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.
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.
Sí, también lo utilicé de esta manera, solo quiero encontrar una forma un poco simple. – Mil0R3
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]; –
@ 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
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
}
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
.
¿Para qué necesitas esta gama? – holex
@holex Solo necesito una matriz con números continuos, no quiero iniciarla con un bucle. – Mil0R3
, 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