web-dev-qa-db-fra.com

Faire un tableau d'entiers dans iOS

Si vous voulez faire un tableau d'entiers, pouvez-vous utiliser NSInteger? Devez-vous utiliser NSNumber? Si oui, alors pourquoi?

94
neuromancer

Vous pouvez utiliser un ancien tableau en clair:

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

Ou bien, vous pouvez utiliser un NSArray ou NSMutableArray, mais ici, vous devrez envelopper chaque entier dans une instance NSNumber (car les objets NSArray sont conçus contenir des instances de 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]);
156
dreamlax

Tableau C:

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

Tableau Objective-C:

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

Tableau rapide:

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

C'est correct aussi:

var array = Array(1...10)

NB: les tableaux sont fortement typés en Swift; dans ce cas, le compilateur déduit du contenu que le tableau est un tableau d'entiers. Vous pouvez aussi utiliser cette syntaxe de type explicite:

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

Si vous vouliez un tableau de doubles, vous utiliseriez:

var array = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] // implicit type-inference

ou:

var array: [Double] = [1, 2, 3, 4, 5, 6] // explicit type
54
Frédéric Adda

Si vous souhaitez utiliser un tableau NSArray, vous avez besoin d'une classe Objective-C pour l'insérer, d'où l'exigence NSNumber.

Cela dit, Obj-C est toujours C, vous pouvez donc utiliser des tableaux C normaux et conserver des ints réguliers au lieu de NSNumbers si vous en avez besoin.

5
Dennis Munsie

J'ai créé un simple wrapper Objective C autour du bon vieux tableau C pour pouvoir l'utiliser plus facilement: https://Gist.github.com/47057

4
MrTJ

Vous pouvez utiliser CFArray au lieu de NSArray. Ici est un article expliquant comment.

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

Il en va de même pour la version CoreFoundation des autres conteneurs.

4
coyotte508

Si l'ordre de vos entiers n'est pas obligatoire et s'il n'y a que des valeurs uniques

vous pouvez également utiliser NSIndexSet ou NSMutableIndexSet. Vous pourrez facilement ajouter et supprimer des entiers, ou vérifier si votre tableau contient un entier avec

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

Consultez le documentation pour plus d'informations.

3
didier_v_

Je pense que c'est beaucoup plus facile d'utiliser NSNumbers. Tout ce que vous devez faire:

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