Как добавить целое число в массив?

#iphone #objective-c #cocoa-touch

#iPhone #objective-c #cocoa-touch

Вопрос:

Это должно быть довольно просто, но мне было интересно, как добавить целое число в массив?

Я знаю, что могу добавить строки, подобные этой:

 NSMutableArray *trArray = [[NSMutableArray alloc] init];
[trArray addObject:@"0"];
[trArray addObject:@"1"];
[trArray addObject:@"2"];
[trArray addObject:@"3"];
  

Но, я думаю, я не могу просто добавлять целые числа вот так:

 NSMutableArray *trArray = [[NSMutableArray alloc] init];
[trArray addObject:0];
[trArray addObject:1];
[trArray addObject:2];
[trArray addObject:3];
  

По крайней мере, компилятор этим недоволен и сообщает мне, что я выполняю приведение, не сообщив ему об этом.

Любые объяснения были бы очень признательны.

Ответ №1:

Да, это верно. Компилятор не примет ваш код в таком виде. Разница заключается в следующем:

Если вы пишете @"a String" , это то же самое, как если бы вы создали строку и автоматически выпустили ее. Итак, вы создаете объект с помощью @"a String" .

Но массив может хранить только объекты (точнее: указатели на объект). Итак, вам нужно создать объекты, которые хранят ваше целое число.

 NSNumber *anumber = [NSNumber numberWithInteger:4];
[yourArray addObject:anumber];
  

Чтобы повторно получить целое число, сделайте это следующим образом

 NSNumber anumber = [yourArray objectAtIndex:6];
int yourInteger = [anumber intValue];
  

Я надеюсь, что мой ответ поможет вам понять, почему это не работает. Вы не можете преобразовать целое число в указатель. И это предупреждение, которое вы получаете от Xcode.

Редактировать:

Теперь также можно написать следующее

 [yourArray addObject:@3];
  

который является ярлыком для создания NSNumber. Для массивов доступен тот же синтаксис

 @[@1, @2];
  

выдаст вам NSArray, содержащий 2 объекта NSNumber со значениями 1 и 2.

Комментарии:

1. Спасибо, думаю, теперь я это понимаю. Ваше объяснение очень хорошее!

2. Спасибо. Ответ mservidio абсолютно правильный. Но я всегда хотел бы получить объяснение. 😉

3. Просто следующий вопрос: является ли ‘number’, хранящееся в моем массиве, целым числом (int) или NSInteger? Или это действительно не имеет значения?

4. Насколько я знаю, разница заключается только в разнице в размере, который используется для хранения этого значения. Обычно я использую int. Единственная причина для меня: это меньше для записи. 😉 Возможно, здесь есть кто-нибудь, кто может объяснить разницу. Я не могу.

5. Это неправильно, строковые литералы не выпускаются автоматически. Они имеют статическую продолжительность хранения и максимально возможное количество ссылок (что указывает на то, что их количество ссылок даже не может быть уменьшено на release ).

Ответ №2:

Я думаю, вам придется использовать NSNumbers, попробуйте добавить эти объекты в свой массив: [NSNumber numberWithInteger:myInt];

 NSMutableArray *trArray = [[NSMutableArray alloc] init];     
NSNumber *yourNumber = [[NSNumber alloc] numberWithInt:5];

[trArray addObject: yourNumber];
  

Комментарии:

1. mservidio верен. Я полагаю, что думать об этом можно потому, что @"2" это NSString объект. Однако 2 само по себе является значением, а не объектом.

2. для расширения вы в основном создаете экземпляр объекта NSNumber, который является объектной версией примитивного int или чего-то еще, а затем добавляете этот объект в массив. Кроме того, чтобы получить исходное значение обратно из массива, используйте [[myArray objectAtIndex:0] intValue];

Ответ №3:

Вы также можете использовать это, если хотите использовать строки:

 NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:[NSString stringWithFormat:@"%d",1]];
[[array objectAtIndex:0] intValue];