Ios 如何使用Parse.com处理NSDecimalNumber?

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方法,我感到困惑 如果没有,处理这种情况的正确方法是什么?我真的不想每

我正在使用Parse.com构建我的应用程序,我需要使用
NSDecimalNumber
,因为我的应用程序需要处理金钱计算。我知道Parse存储数字,然后将其作为
NSNumber
检索。所以我的问题是,有没有办法更改使用
NSDecimalNumber
PFObjects
属性的getter,使其返回
NSDecimalNumber
而不是
NSNumber
?我正在使用
PFObject
子类,由于使用
@dynamic
定义阻止我重写getter方法,我感到困惑

如果没有,处理这种情况的正确方法是什么?我真的不想每次访问这些属性时都转换这些数字


谢谢。

这对我来说也是一场噩梦!如果不将
NSNumber
转换为
NSDecimalNumber
,然后再转换为
NSDecimalNumber
,最终会出现如下错误:

[\uu NSCFNumber decimalNumberByAdding:]:发送到实例的选择器无法识别

要修复它,您可以检查属性属性以查看Parse.com应该返回什么类型,并在getter中返回一个real
NSDecimalNumber

将其粘贴到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。让它始终返回一个小数@动态应该不重要(首先应该是不必要的)