Как правильно установить целочисленное значение в NSDictionary? - PullRequest
13 голосов
/ 22 октября 2009

Следующий фрагмент кода:

NSLog(@"userInfo: The timer is %d", timerCounter);

NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:timerCounter] forKey:@"timerCounter"];

NSUInteger c = (NSUInteger)[dict objectForKey:@"timerCounter"];
NSLog(@"userInfo: Timer started on %d", c);

производит вывод в соответствии с:

2009-10-22 00:36:55.927 TimerHacking[2457:20b] userInfo: The timer is 1
2009-10-22 00:36:55.928 TimerHacking[2457:20b] userInfo: Timer started on 5295968

(FWIW, timerCounter является NSUInteger.)

Я уверен, что упускаю что-то довольно очевидное, просто не уверен, что это такое.

Ответы [ 3 ]

23 голосов
/ 22 октября 2009

Вы должны использовать intValue из полученного объекта (NSNumber) и не использовать приведение:

NSUInteger c = [[dict objectForKey:@"timerCounter"] intValue];
11 голосов
/ 22 октября 2009

Словари всегда хранят объекты. NSInteger и NSUInteger не являются объектами. Ваш словарь хранит NSNumber (помните, что [NSNumber numberWithInteger:timerCounter]?), Который является объектом. Итак, как сказал эпатель, вам нужно спросить у NSNumber его unsignedIntegerValue, если вы хотите NSUInteger.

0 голосов
/ 19 декабря 2016

Или вот так с литералами:

NSUInteger c = ((NSNumber *)dict[@"timerCounter"]).unsignedIntegerValue;

Вы должны сначала преобразовать в NSNumber, поскольку объект, извлеченный из словаря, будет id_nullable и не будет отвечать на методы преобразования значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...