Ios 如何使用Parse.com处理NSDecimalNumber?
我正在使用Parse.com构建我的应用程序,我需要使用Ios 如何使用Parse.com处理NSDecimalNumber?,ios,objective-c,parse-platform,nsdecimalnumber,Ios,Objective C,Parse Platform,Nsdecimalnumber,我正在使用Parse.com构建我的应用程序,我需要使用NSDecimalNumber,因为我的应用程序需要处理金钱计算。我知道Parse存储数字,然后将其作为NSNumber检索。所以我的问题是,有没有办法更改使用NSDecimalNumber的PFObjects属性的getter,使其返回NSDecimalNumber而不是NSNumber?我正在使用PFObject子类,由于使用@dynamic定义阻止我重写getter方法,我感到困惑 如果没有,处理这种情况的正确方法是什么?我真的不想每
NSDecimalNumber
,因为我的应用程序需要处理金钱计算。我知道Parse存储数字,然后将其作为NSNumber
检索。所以我的问题是,有没有办法更改使用NSDecimalNumber
的PFObjects
属性的getter,使其返回NSDecimalNumber
而不是NSNumber
?我正在使用PFObject
子类,由于使用@dynamic
定义阻止我重写getter方法,我感到困惑
如果没有,处理这种情况的正确方法是什么?我真的不想每次访问这些属性时都转换这些数字
谢谢。这对我来说也是一场噩梦!如果不将
NSNumber
转换为NSDecimalNumber
,然后再转换为NSDecimalNumber
,最终会出现如下错误:
[\uu NSCFNumber decimalNumberByAdding:]:发送到实例的选择器无法识别
要修复它,您可以检查属性属性以查看Parse.com应该返回什么类型,并在getter中返回一个realNSDecimalNumber
将其粘贴到PFObject子类的实现中:
- (id)objectForKey:(NSString *)key
{
id object = [super objectForKey:key];
// Get property attributes
objc_property_t property = class_getProperty([self class], [key UTF8String]);
NSString *attributes = [NSString stringWithUTF8String:property_getAttributes(property)];
// Ensure decimal numbers are returned correctly
if ([attributes rangeOfString:@"NSDecimalNumber"].location != NSNotFound) {
if (object != nil) {
return [NSDecimalNumber decimalNumberWithDecimal:[object decimalValue]];
}
}
return object;
}
我在Parse.com中设置NaN时也遇到问题(即它崩溃),因此我现在也会像这样覆盖setter:
- (void)setObject:(id)object forKey:(NSString *)key
{
// Skip decimal numbers which are NaN
if ([object isKindOfClass:[NSDecimalNumber class]] && [object isEqualToNumber:[NSDecimalNumber notANumber]]) {
return [self removeObjectForKey:key];
}
[super setObject:object forKey:key];
}
编辑:
后来我意识到,在解析中存储NSDecimalNumber实际上并不存储十进制数,而是存储浮点数!因此,保持准确性的最佳方法是在解析时将十进制数保存为NSString
值,并在返回时重新解释它们
如果我们交换两件事,上面的代码工作得非常好:
在objectForKey:
中:
// Ensure decimal numbers are returned correctly
if ([attributes rangeOfString:@"NSDecimalNumber"].location != NSNotFound) {
if (object != nil) {
return [NSDecimalNumber decimalNumberWithString:object];
}
}
在setObject:forKey:
// Save decimal numbers as strings
if ([object isKindOfClass:[NSDecimalNumber class]]) {
return [super setObject:[object stringValue] forKey:key];
}
-[NSNumber decimalValue]
是否返回您期望的值?它返回,但每次访问属性时,我都必须转换它。让对象的属性返回NSDecimalNumber会更简洁、更易于维护。您是否检查过该对象实际上不是一个NSDecimalNumber
,因为它是NSNumber
的子类?是,事实上,它正在破坏我的应用程序,因为它无法识别发送给它的与NSDecimalNumber
类对应的消息。当我调试它时,它显示为NSNumber
。谢谢。在类的自定义类别扩展中重写属性的getter。让它始终返回一个小数@动态应该不重要(首先应该是不必要的)