Проблема с преобразованием значения в 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
для дополнительной информации.