Преобразование NSNumber в int в Objective-C

Я использую [NSNumber numberWithInt:42] или @(42) для преобразования int в NSNumber перед добавлением его в NSDictionary:

int intValue = 42;
NSNumber *numberValue = [NSNumber numberWithInt:intValue];
NSDictionary *dict = @{ @"integer" : numberValue };

Когда я получаю значение из NSDictionary, как я могу преобразовать его из NSNumber обратно в int?

NSNumber *number = dict[@"integer"];
int *intNumber = // ...?

Он выдает исключение, в котором говорится, что требуется приведение, когда я делаю это следующим образом:

int number = (int)dict[@"integer"];

person suse    schedule 24.08.2010    source источник


Ответы (5)



По возможности следует придерживаться NSInteger типов данных. Итак, вы бы создали такое число:

NSInteger myValue = 1;
NSNumber *number = [NSNumber numberWithInteger: myValue];

Декодирование работает с методом integerValue, тогда:

NSInteger value = [number integerValue];
person Max Seelemann    schedule 24.08.2010
comment
Почему он должен придерживаться NSInteger? - person Iulian Onofrei; 19.12.2014
comment
NSInteger - это примитивный тип, который намного во время выполнения работает быстрее, чем NSNumber, являющийся объектом. - person Max Seelemann; 19.12.2014
comment
А что такое int? Тоже примитив? - person Iulian Onofrei; 19.12.2014
comment
int тоже примитивен, да. Однако его максимально допустимое число определено менее точно. NSInteger - это, по сути, просто псевдоним некоторого примитивного целочисленного типа, который, как известно, является 32-битным на 32-битных машинах и 64-битным на 64-битных устройствах. - person Max Seelemann; 06.01.2015
comment
Так что в большинстве случаев лучше использовать NSInteger вместо int? - person Iulian Onofrei; 06.01.2015
comment
Да, Apple предлагает. - person Max Seelemann; 09.01.2015
comment
Зилманн, но я полагаю, что если я знаю, что числа, которые мне нужны, невелики, можно использовать int вместо NSInteger, верно? - person Iulian Onofrei; 09.01.2015
comment
Я бы рекомендовал не делать никаких предположений о собственной числовой арифметике. Вы можете использовать int, но в этом нет особого смысла, за исключением взаимодействия с кроссплатформенными библиотеками. И даже тогда что-то вроде uint32_t было бы лучше использовать. - person Max Seelemann; 11.01.2015
comment
Извините, если я вас беспокою, я просто пытаюсь узнать и понять больше. Недавно я начал изучать Objective C, работая над большим проектом, и думаю о способах его рефакторинга. Итак, было бы неплохо заменить int на NSInteger везде, где это возможно, в существующем проекте, не так ли? - person Iulian Onofrei; 11.01.2015
comment
Это, безусловно, сделает его более совместимым со стандартами кодирования платформы, да. - person Max Seelemann; 12.01.2015
comment
Всегда используйте NSInteger. - person Fattie; 14.08.2015

Используйте метод NSNumber intValue

Вот Справочная документация Apple

person rano    schedule 24.08.2010

Протестированный однострочник:

int number = ((NSNumber*)[dict objectForKey:@"integer"]).intValue;
person Giorgio Barchiesi    schedule 27.09.2019

Менее подробный подход:

int number = [dict[@"integer"] intValue];
person baskInEminence    schedule 15.07.2015