Faire un tableau d'entiers dans iOS

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

Vous pouvez utiliser un ancien tableau C simple:

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, vous pouvez utiliser un NSArray ou NSMutableArray , mais ici, vous devrez envelopper chaque entier dans une instance NSNumber (parce que les objects NSArray sont conçus pour contenir des instances de class).

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

C tableau:

 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] 

C'est correct aussi:

 var array = Array(1...10) 

NB: les arrays sont fortement typés dans Swift; dans ce cas, le compilateur déduit du contenu que le tableau est un tableau d'entiers. Vous pouvez également 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 

Si vous voulez utiliser un NSArray, vous avez besoin d'une class Objective-C pour l'insert – d'où l'exigence NSNumber.

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

Vous pouvez utiliser CFArray au lieu de NSArray. Voici 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 */ 

La même chose s'applique à la version CoreFoundation des autres conteneurs.

J'ai créé un simple wrapper Objective C autour du bon vieux tableau C à utiliser plus facilement: https://gist.github.com/4705733

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

vous pouvez également utiliser NSIndexSet ou NSMutableIndexSet Vous pourrez facilement append 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 la documentation pour plus d'informations.

Je pense qu'il 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];