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

122

Я использую [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"];
SUSE
источник

Ответы:

192

Взгляните на документацию . Используйте intValueметод:

NSNumber *number = [dict objectForKey:@"integer"];
int intValue = [number intValue];
Феликс Клинг
источник
Неявное преобразование теперь запрещено в ARC.
Александр
в основном [key intValue](ключ NSNumber)
user924
61

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

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

Декодирование работает следующим integerValueобразом:

NSInteger value = [number integerValue];
Макс Зелеманн
источник
Почему он должен придерживаться NSInteger?
Юлиан Онофрей
1
intтоже примитивно, да. Однако его максимально допустимое число определено менее точно. NSIntegerпо сути, это просто псевдоним некоторого примитивного целочисленного типа, который, как известно, является 32-битным на 32-битных машинах и 64-битным на 64-битных устройствах.
Макс Зелеманн, 06
1
Да, Apple предлагает.
Макс Зелеманн,
1
Я бы рекомендовал ничего не делать предположений о собственной числовой арифметике. Вы можете использовать его int, но в этом нет особого смысла, за исключением взаимодействия с кроссплатформенными библиотеками. И даже тогда что-то вроде uint32_tбы лучше было бы использовать.
Макс Зелеманн,
1
Да, это, безусловно, сделает его более совместимым со стандартами кодирования платформы.
Макс Зелеманн,
1

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

int number = [dict[@"integer"] intValue];
baskInEminence
источник
0

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

int number = ((NSNumber*)[dict objectForKey:@"integer"]).intValue;
Джорджио Баркиези
источник