Створення масиву цілих чисел в iOS


98

Якщо ви хочете створити масив цілих чисел, можете скористатися NSInteger? Чи потрібно використовувати NSNumber? Якщо так, то чому?


Що ви хочете зробити зі своїм масивом цілих чисел?
dreamlax

Не впевнений. Я тільки десь чув, що вам потрібно використовувати NSNumber для масивів, і тому мені було цікаво про це.
невроман

Відповіді:


159

Ви можете використовувати звичайний старий масив 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]);

9
Я думаю, що варто відзначити, що масиви C - це неприємність для будь-якого, крім тривіального, одноразового використання, що насправді менше проблем обгортати будь-які масиви, які ви плануєте зберігати як NSArrays NSNumber.
Чак

2
Так, і враховуючи [імовірно] експертні рівні оптимізації під кришкою NSArray, я впевнений, що ви не відчуєте хіт продуктивності.
dreamlax

@dreamlax Цікаво, яка оптимізація на рівні експертів знаходиться під кришкою NSArray? Розумний розподіл пам’яті, який, ймовірно, подвоює розмір виділеної пам’яті, як тільки вона досягає межі?
Бен Сінклер

2
@Andy: Подивіться на фактичне джерело для CFArray тут і ознайомтеся з орієнтирами тут . Це трохи розумніше, ніж ви спочатку думали.
dreamlax

Якщо припустити, що цей масив просто використовується в рамках методу, немає проблем із використанням масиву C NSIntegers? Просто подвійна перевірка ...
Dan Rosenstark,

58

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

Швидкий масив:

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

Це також правильно:

var array = Array(1...10)

Примітка: масиви сильно набрані в 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

1
Який би був еквівалентний синтаксис "@ число" для від'ємного цілого числа?
Зіофіл

5

Якщо ви хочете використовувати NSArray, вам потрібен клас Objective-C, щоб ввести його - отже, і вимога NSNumber.

Однак, Obj-C все ще є C, тому ви можете використовувати регулярні масиви C і утримувати регулярні вставки замість 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 для інших контейнерів.


3
Якщо є перевага використання CFArray над NSArray, я цього не бачу. NSArray - це CFArray під кришкою; це просто робити це важким шляхом.
Девід Гіш

1
@Cryptognome тут невелика різниця, CFArray нічого не зберігатиме і не випускає, оскільки він був створений без зворотних зворотних дзвінків. Я погоджуюсь, однак, здається, немає жодної переваги.
dreamlax


3

Якщо порядок ваших цілих чисел не потрібно, і якщо є лише унікальні значення

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

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

Перегляньте документацію для отримання додаткової інформації.


2
Це жахлива ідея. Ось фрагмент з документації Apple: Ви не повинні використовувати набори індексів для зберігання довільної колекції цілих значень, тому що індекси зберігають індекси як відсортовані діапазони. Це робить їх більш ефективними, ніж зберігання колекції окремих цілих чисел. Це також означає, що кожне значення індексу може з’являтися лише один раз у наборі індексів.
Рудольф Адамкович

1
Я згоден, і саме тому я почав свою відповідь з попередження. Однак я знаю деяких людей, які задають це питання про цілі масиви, і насправді потрібен набір індексів. Тому я дав цю альтернативну відповідь.
didier_v_

Що не так у звичайному NSSet(та використанні цілих чисел, загорнутих у NSNumber)?
dreamlax

@dreamlax накладні, але, загалом кажучи, люди, які задають такі питання, не можуть впоратися з C, і вони просто мають кілька номерів для зберігання, тому NSArray або NSSet повинні бути найкращими.
Бен Сінклер

2

Я думаю, що набагато простіше використовувати NSNumbers. Це все, що вам потрібно зробити:

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

але що робити, якщо ваш масив має 10 чи 100 чисел?
Хенсон

1
Ви можете використовувати forабо просто інший масив для чисел, а потім arrayWithArray.
Нееку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.