2010-07-27 24 views
88

Si desea crear una matriz de enteros, ¿puede usar NSInteger? ¿Tienes que usar NSNumber? Si es así, ¿por qué?Creación de una matriz de enteros en iOS

+0

Qué hacer quieres hacer con tu matriz de enteros? – dreamlax

+0

No estoy seguro. Acabo de enterarme de que debes usar NSNumber para las matrices, así que me preguntaba sobre eso. – neuromancer

Respuesta

146

Se puede utilizar una llanura matriz de edad C:

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 bien, puede utilizar un NSArray o NSMutableArray, pero aquí tendrá que terminar cada entero dentro de una instancia NSNumber (porque NSArray objetos están diseñados para mantener instancias de clase).

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]); 
+8

Creo que vale la pena señalar que las matrices en C son una molestia para cualquier cosa que no sea trivial, el uso de una sola vez que en realidad es menos problemas para envolver las matrices que planea mantener como NSArrays de NSNumber. – Chuck

+2

Sí, y dadas las [presumiblemente] optimizaciones de nivel experto bajo el capó de 'NSArray', estoy seguro de que no sentirán el rendimiento alcanzado. – dreamlax

+0

@dreamlax Me pregunto qué tipo de optimización de nivel experto está bajo el capó de NSArray. ¿Asignación inteligente de memoria que simplemente duplica el tamaño de la memoria asignada una vez que llega al límite? :) p – Andy

5

Si desea utilizar un NSArray, necesita una clase de Objective-C para poner en él - de ahí la necesidad NSNumber.

Dicho esto, Obj-C sigue siendo C, por lo que puede utilizar matrices C normales y realizar operaciones regulares en lugar de NSNumbers si es necesario.

4

Puede usar CFArray en lugar de NSArray. Here es 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.

+2

Si hay una ventaja de usar CFArray sobre NSArray, no lo veo. Un NSArray ES un CFArray bajo el capó; esto es solo hacerlo de la manera difícil. –

+1

@Cryptognome hay una pequeña diferencia aquí, el CFArray no retendrá o lanzará nada porque fue creado sin devoluciones de llamada. Aunque estoy de acuerdo, no parece haber ninguna ventaja. – dreamlax

2

Creo que es mucho más fácil usar NSNumbers. Esta todo lo que tiene que hacer:

NSNumber *myNum1 = [NSNumber numberWithInt:myNsIntValue1]; 
NSNumber *myNum2 = [NSNumber numberWithInt:myNsIntValue2]; 
. 
. 
. 
NSArray *myArray = [NSArray arrayWithObjects: myNum1, myNum2, ..., nil]; 
+0

, pero ¿y si tu matriz tiene 10 o 100 números? – Henson

+0

Puede usar 'for' o simplemente otra matriz para los números, y luego' arrayWithArray'. – Neeku

3

Si no se requiere el orden de los números enteros, y si hay sólo valores únicos

también puede utilizar NSIndexSet o NSMutableIndexSet podrá añadir y eliminar fácilmente los números enteros, o comprobar si su matriz contiene un entero con

- (void)addIndex:(NSUInteger)index 
- (void)removeIndex:(NSUInteger)index 
- (BOOL)containsIndexes:(NSIndexSet *)indexSet 

Compruebe el documentation para obtener más información.

+2

Esa es una idea terrible. Aquí hay una pieza de la documentación de Apple: _No debe usar conjuntos de índices para almacenar una colección arbitraria de valores enteros porque el índice establece índices de tiendas como rangos ordenados. Esto los hace más eficientes que almacenar una colección de enteros individuales. También significa que cada valor de índice solo puede aparecer una vez en el conjunto de índices. –

+1

Acepto y es por eso que comencé mi respuesta con una advertencia. Sin embargo, conozco a algunas personas que hacen esta pregunta acerca de las matrices de enteros, y realmente necesitaban un conjunto de índices. Es por eso que di esta respuesta alternativa. –

+0

¿Qué pasa con solo un 'NSSet' normal (y el uso de enteros incluidos en un' NSNumber')? – dreamlax

44

C array:

NSInteger array[6] = {1, 2, 3, 4, 5, 6}; 

Objective-C matriz:

NSArray *array = @[@1, @2, @3, @4, @5, @6]; 
// numeric values must in that case be wrapped into NSNumbers 

matriz Swift:

var array = [1, 2, 3, 4, 5, 6] 

Esto es correcto demasiado:

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.Se podría utilizar esta sintaxis de tipo explícito, también:

var array: [Int] = [1, 2, 3, 4, 5, 6] 

Si quería una serie de dobles, se debería utilizar:

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 
+0

¿Cuál sería la sintaxis equivalente "@number" para un entero negativo? – Ziofil

+1

@Ziofil: '@ -1' funciona, al igual que' @ (- 1) '. – dreamlax

Cuestiones relacionadas