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