Проблема с преобразованием значения в iOS, используя NSUInteger и NSMutableDictionary

У меня есть NSMutableDictionary который содержит несколько элементов в паре ключ / значение. Я сохранил строки с ключом и извлек их без проблем, однако, когда я сохраняю значение типа NSUInteger и попытаться извлечь это из словаря, в результате я получаю действительно большое значение.

В первой части моего оператора if я проверяю, не ищет ли искомое значение ноль или больше нуля. Я пытаюсь в основном сохранить счет или значение в словаре, к которому я могу получить доступ, чтобы я мог добавить или убрать.

Как вы можете видеть в утверждении else у меня есть два NSLog заявления, вот где я вижу разницу в стоимости. Первый NSLog В операторе отображается значение 100, как и следовало ожидать от нажатия кнопки "Happy". Однако, как только значение извлекается из словаря, currentTotal равен 109709424. Я уверен, что это как-то связано с описателем формата, который я использую при преобразовании этого целочисленного значения в строку. Я пытался сохранить это значение currentTotal как int или NSUInteger в своем словаре под ключом "Всего", но преобразование из объекта нецелевого типа c в "id" запрещено в ARC, поэтому я застрял.

NSUInteger currentTotal = 0;
NSUInteger happinessValue = 100;
NSUInteger sadnessValue = 20; 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    if ([appDelegate.data valueForKey:@"Total"] != nil || [appDelegate.data valueForKey:@"Total"] > 0) {

        currentTotal = (int)[appDelegate.data valueForKey:@"Total"];

        if ([segue.identifier isEqualToString:@"Happy"]) {
            [segue.destinationViewController setHappiness:(int)happinessValue :segue.identifier];
            currentTotal = add(currentTotal, happinessValue);

            [appDelegate.data setObject:(NSString *)[NSString stringWithFormat: @"Value: %i", happinessValue] forKey:@"Value"];
        } else if ([segue.identifier isEqualToString:@"Sad"]) {
            [segue.destinationViewController setHappiness:(int)sadnessValue :segue.identifier];
            currentTotal -= [segue.destinationViewController setTotalValue:happinessValue];
            [appDelegate.data setObject:(NSString *)[NSString stringWithFormat: @"Value: %i", sadnessValue] forKey:@"Value"];
        }
    }
    else {

        if ([segue.identifier isEqualToString:@"Happy"]) {
            [segue.destinationViewController setHappiness:(int)happinessValue :segue.identifier];
            NSLog(@"Old value ELSE: %i", currentTotal);
            currentTotal = [segue.destinationViewController setTotalValue:happinessValue];
            NSLog(@"New value ELSE: %i", currentTotal);
            [appDelegate.data setObject:(NSString *)[NSString stringWithFormat: @"Value: %i", happinessValue] forKey:@"Value"];
        } else if ([segue.identifier isEqualToString:@"Sad"]) {
            [segue.destinationViewController setHappiness:(int)sadnessValue :segue.identifier];
            currentTotal = [segue.destinationViewController setTotalValue:happinessValue];
            [appDelegate.data setObject:(NSString *)[NSString stringWithFormat: @"Value: %i", sadnessValue] forKey:@"Value"];
        }

        NSLog(@"Current Total: %i", currentTotal);
        [appDelegate.data setObject:[NSString stringWithFormat:@"%d", currentTotal] forKey:@"Total"];
        NSLog(@"Total stored: %i", (int)[appDelegate.data valueForKey:@"Total"]);
    }

}

1 ответ

Это выглядит как проблема:

currentTotal = (int)[appDelegate.data valueForKey:@"Total"];

-valueForKey: возвращает указатель на объект Objective-C, а не intтак что вы не можете бросить его на int и ожидать, что что-то полезное случится. Если это NSNumberтогда вам нужно сделать что-то вроде этого:

currentTotal = [[appDelegate.data valueForKey:@"Total"] intValue];

Смотрите документы наNSNumber для дополнительной информации.

Другие вопросы по тегам