Si desea hacer una matriz de números enteros, ¿puede usar NSInteger? ¿Tiene que usar NSNumber? Si es así, ¿por qué?
Si desea hacer una matriz de números enteros, ¿puede usar NSInteger? ¿Tiene que usar NSNumber? Si es así, ¿por qué?
Respuestas:
Puede usar una matriz C simple y antigua:
NSInteger myIntegers[40];
for (NSInteger i = 0; i < 40; i++)
myIntegers[i] = i;
// to get one of them
NSLog (@"The 4th integer is: %d", myIntegers[3]);
O puede usar una NSArray
o NSMutableArray
, pero aquí deberá envolver cada entero dentro de una NSNumber
instancia (porque los NSArray
objetos están diseñados para contener instancias de clases).
NSMutableArray *myIntegers = [NSMutableArray array];
for (NSInteger i = 0; i < 40; i++)
[myIntegers addObject:[NSNumber numberWithInteger:i]];
// to get one of them
NSLog (@"The 4th integer is: %@", [myIntegers objectAtIndex:3]);
// or
NSLog (@"The 4th integer is: %d", [[myIntegers objectAtIndex:3] integerValue]);
NSArray
, estoy seguro de que no sentirás el impacto en el rendimiento.
Matriz C:
NSInteger array[6] = {1, 2, 3, 4, 5, 6};
Matriz Objective-C:
NSArray *array = @[@1, @2, @3, @4, @5, @6];
// numeric values must in that case be wrapped into NSNumbers
Matriz veloz:
var array = [1, 2, 3, 4, 5, 6]
Esto también es correcto:
var array = Array(1...10)
NB: las matrices están fuertemente tipadas en Swift; en ese caso, el compilador infiere del contenido que la matriz es una matriz de enteros. También puede usar esta sintaxis de tipo explícito:
var array: [Int] = [1, 2, 3, 4, 5, 6]
Si quisiera una matriz de dobles, usaría:
var array = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] // implicit type-inference
o:
var array: [Double] = [1, 2, 3, 4, 5, 6] // explicit type
Si desea utilizar un NSArray, necesita una clase Objective-C para colocarlo, de ahí el requisito NSNumber.
Dicho esto, Obj-C sigue siendo C, por lo que puede usar matrices C regulares y mantener entradas regulares en lugar de NSNumbers si es necesario.
Puede utilizar CFArray en lugar de NSArray. Aquí hay un artículo que explica cómo.
CFMutableArrayRef ar = CFArrayCreateMutable(NULL, 0, NULL);
for (NSUInteger i = 0; i < 1000; i++)
{
CFArrayAppendValue(ar, (void*)i);
}
CFRelease(ar); /* Releasing the array */
Lo mismo se aplica a la versión CoreFoundation de los otros contenedores también.
Creé una envoltura de Objective C simple alrededor de la vieja matriz C para usarla de manera más conveniente: https://gist.github.com/4705733
Si no se requiere el orden de sus números enteros y si solo hay valores únicos
también puede usar NSIndexSet o NSMutableIndexSet Podrá agregar y eliminar enteros fácilmente, o verificar si su matriz contiene un entero con
- (void)addIndex:(NSUInteger)index
- (void)removeIndex:(NSUInteger)index
- (BOOL)containsIndexes:(NSIndexSet *)indexSet
Consulte la documentación para obtener más información.
NSSet
(y usar enteros envueltos en un NSNumber
)?
Creo que es mucho más fácil usar NSNumbers. Esto es todo lo que necesitas hacer:
NSNumber *myNum1 = [NSNumber numberWithInt:myNsIntValue1];
NSNumber *myNum2 = [NSNumber numberWithInt:myNsIntValue2];
.
.
.
NSArray *myArray = [NSArray arrayWithObjects: myNum1, myNum2, ..., nil];
for
o simplemente otra matriz para los números, y luego arrayWithArray
.