Создание массива целых чисел в iOS

Если вы хотите создать массив целых чисел, можете ли вы использовать NSInteger? Нужно ли использовать NSNumber? Если да, то почему?

Ответ 1

Вы можете использовать простой старый массив 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]);

Или вы можете использовать NSArray или NSMutableArray, но здесь вам нужно будет обернуть каждое целое число внутри экземпляра NSNumber (поскольку объекты NSArray предназначены для хранения экземпляров класса).

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

Ответ 2

C массив:

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

Objective-C Массив:

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]

Это тоже верно:

var array = Array(1...10)

NB: массивы строго типизированы в Swift; в этом случае компилятор выводит из содержимого, что массив представляет собой массив целых чисел. Вы также можете использовать этот синтаксис явного типа:

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

Если вам нужен массив парных разрядов, вы должны использовать:

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

или

var array: [Double] = [1, 2, 3, 4, 5, 6] // explicit type

Ответ 3

Если вы хотите использовать NSArray, вам понадобится класс Objective-C, чтобы вставить его - следовательно, требование NSNumber.

Тем не менее, Obj-C по-прежнему C, поэтому вы можете использовать обычные C-массивы и использовать регулярные ints вместо NSNumbers, если вам нужно.

Ответ 4

Вы можете использовать CFArray вместо NSArray. Здесь - статья, объясняющая, как.

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

То же самое относится и к версии CoreFoundation других контейнеров.

Ответ 5

Я создал простую обертку Objective C вокруг старого старого массива C, который будет использоваться более удобно: https://gist.github.com/4705733

Ответ 6

Если порядок целых чисел не требуется,  и если существуют только уникальные значения

вы также можете использовать NSIndexSet или NSMutableIndexSet Вы сможете легко добавлять и удалять целые числа или проверять, содержит ли ваш массив целое число с

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

Подробнее о documentation.

Ответ 7

Я думаю, что намного проще использовать NSNumbers. Это все, что вам нужно сделать:

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