Creare un array di numeri interi in iOS


98

Se vuoi creare un array di numeri interi, puoi usare NSInteger? Devi usare NSNumber? Se è così, allora perché?


Cosa vuoi fare con il tuo array di numeri interi?
dreamlax

Non sono sicuro. Ho appena sentito da qualche parte che devi usare NSNumber per gli array e quindi me lo chiedevo.
neuromante

Risposte:


159

Puoi usare un semplice vecchio array 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]);

Oppure puoi usare NSArrayo NSMutableArray, ma qui dovrai racchiudere ogni numero intero all'interno di NSNumberun'istanza (perché gli NSArrayoggetti sono progettati per contenere istanze di classe).

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

9
Penso che valga la pena notare che gli array C sono una tale seccatura per tutto tranne che per un uso banale e una tantum che in realtà è meno problematico avvolgere gli array che si intende mantenere come NSArrays di NSNumber.
Chuck

2
Sì, e date le [presumibilmente] ottimizzazioni a livello di esperti sotto il cofano di NSArray, sono sicuro che non sentirai il colpo di prestazioni.
dreamlax

@dreamlax Mi chiedo che tipo di ottimizzazione a livello di esperto ci sia sotto il cofano di NSArray? Allocazione intelligente della memoria che probabilmente raddoppia la dimensione della memoria allocata una volta raggiunto il limite? :) p
Ben Sinclair

2
@ Anddy: dai un'occhiata alla fonte effettiva di CFArray qui e dai un'occhiata ai benchmark qui . È un po 'più intelligente di quanto penseresti inizialmente.
dreamlax

Supponendo che questo array venga utilizzato solo all'interno di un metodo, non ci sono problemi con l'utilizzo di un array C di NSInteger? Basta ricontrollare ...
Dan Rosenstark

58

Matrice C:

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

Objective-C Array:

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

Swift Array:

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

Anche questo è corretto:

var array = Array(1...10)

NB: gli array sono fortemente tipizzati in Swift; in tal caso, il compilatore deduce dal contenuto che l'array è un array di numeri interi. Puoi anche usare questa sintassi di tipo esplicito:

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

Se volessi un array di doppi, useresti:

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

1
Quale sarebbe la sintassi "@number" equivalente per un numero intero negativo?
Ziofil

5

Se vuoi usare un NSArray, hai bisogno di una classe Objective-C per inserirlo, da qui il requisito NSNumber.

Detto questo, Obj-C è ancora C, quindi puoi usare normali array C e mantenere int regolari invece di NSNumbers se necessario.


4

Puoi usare CFArray invece di NSArray. Ecco un articolo che spiega come.

CFMutableArrayRef ar = CFArrayCreateMutable(NULL, 0, NULL);
for (NSUInteger i = 0; i < 1000; i++)
{
  CFArrayAppendValue(ar, (void*)i);
}
CFRelease(ar); /* Releasing the array */

Lo stesso vale anche per la versione CoreFoundation degli altri contenitori.


3
Se c'è un vantaggio nell'usare CFArray su NSArray, non lo vedo. Un NSArray È un CFArray sotto il cofano; questo è solo farlo nel modo più duro.
David Gish

1
@Cryptognome c'è una piccola differenza qui, il CFArray non manterrà né rilascerà nulla perché è stato creato senza callback. Sono d'accordo però, non sembra esserci alcun vantaggio.
dreamlax


3

Se l'ordine dei tuoi numeri interi non è richiesto e se ci sono solo valori univoci

puoi anche usare NSIndexSet o NSMutableIndexSet Sarai in grado di aggiungere e rimuovere facilmente interi, o controllare se il tuo array contiene un numero intero con

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

Controlla la documentazione per maggiori informazioni.


2
È un'idea terribile. Ecco un pezzo dalla documentazione di Apple: non dovresti usare i set di indici per memorizzare una raccolta arbitraria di valori interi perché index imposta gli indici di archivio come intervalli ordinati. Ciò li rende più efficienti rispetto all'archiviazione di una raccolta di singoli numeri interi. Significa anche che ogni valore di indice può apparire solo una volta nel set di indici.
Rudolf Adamkovič

1
Sono d'accordo ed è per questo che ho iniziato la mia risposta con un avvertimento. Tuttavia, conosco alcune persone che hanno posto questa domanda sugli array di numeri interi e in realtà avevano bisogno di un set di indici. Ecco perché ho dato questa risposta alternativa.
didier_v_

Cosa c'è di sbagliato in un normale NSSet(e usando numeri interi racchiusi in un NSNumber)?
dreamlax

@dreamlax overhead, ma in generale, le persone che fanno queste domande non possono gestire C e hanno semplicemente pochi numeri da memorizzare, quindi NSArray o NSSet devono essere i migliori.
Ben Sinclair

2

Penso che sia molto più facile usare NSNumbers. Questo è tutto ciò che devi fare:

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

ma cosa succede se il tuo array ha 10 o 100 numeri?
Henson

1
Puoi usare foro solo un altro array per i numeri, e poi arrayWithArray.
Neeku
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.