2013-08-13 1 views
0

Я пытаюсь получить номер из пользовательских значений по умолчанию и умножить его. Вот мой код:Почему NSDecimalNumber разбивается, когда я пытаюсь использовать decimalNumberByMultiplyingBy :?

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSDecimalNumber *current = [prefs objectForKey:@"account"]; 
NSDecimalNumber *multiplier = [NSDecimalNumber decimalNumberWithString:@"1.15"]; 
NSDecimalNumber *floo = [current decimalNumberByMultiplyingBy: multiplier]; 

Это дает мне это действительно отвратительные аварии, как только он попадет в floo линию. Огромные извергают абракадабру ошибки начинается с:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[__NSCFNumber decimalNumberByMultiplyingBy:]: unrecognized selector 
sent to instance 0x8c7b1e0' 

Это казалось очень простой вещью, но мой! Что происходит?

ответ

5

Вы присвоили значение [prefs objectForKey:@"account"] переменной NSDecimalNumber, но фактическое значение - NSNumber, а не NSDecimalNumber. Когда вы пытаетесь вызвать -decimalNumberByMultiplyingBy: на этом объекте, ваша программа сработает, потому что этот объект не знает, что делать с этим методом.

Вы можете преобразовать NSNumber к NSDecimalNumber так:

NSNumber *number = /* ... */ 
NSDecimalNumber *decimalNumber = 
    [NSDecimalNumber decimalNumberWithDecimal:[number decimalValue]]; 
+0

Ницца! Благодаря! Это сделал трюк. –

0

Лучше может быть использовать архиватор, как сохранять объект как:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:current] forKey:@"account"]; 

и извлечения его:

current = [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"account"] ]; 

Это более надежный я думаю, чем видеть, что у вас на самом деле есть __NSCFNumber, и преобразовываю это.

 Смежные вопросы

  • Нет связанных вопросов^_^