将值从字典转换为NSNumber

时间:2013-06-14 15:09:59

标签: ios objective-c type-conversion

我有一个NSDictionary对象,它保存从某个JSON对象转换的数据。

我的问题是一些数字存储为字符串,其他数字存储为整数。即在NSDictionary中,数字可以是NSString类型或NSNumber类型。不知何故,我必须转换数字,以便它们总是返回NSNumber。

这是我到目前为止提出的解决方案:

#import "Convert.h"
@implementation Convert
+(NSNumber *)toInteger:(NSObject *)object {
    if ([object isKindOfClass:[NSNumber class]]) {
        return (NSNumber *) object;
    }
    else if ([object isKindOfClass:[NSString class]]) {

        // Create number formatter
        NSNumberFormatter *formatInt = [[NSNumberFormatter alloc] init];
        [formatInt setNumberStyle:NSNumberFormatterDecimalStyle];

        // return formatted number
        return [formatInt numberFromString:(NSString *) object];
    }
    else {
        return 0;
    }
}
@end

行动中:

NSNumber *myint;
myint = [Convert toInteger:[dict valueForKeyPath:@"myobj.numberAsString"]];
myint = [Convert toInteger:[dict valueForKeyPath:@"myobj.numberAsInteger"]];

这很有效,但看起来很长,而且不是很便宜。还有其他方法我没有考虑过吗?

2 个答案:

答案 0 :(得分:9)

鉴于你总是把你的数字读成整数,我认为你的字符串只能保持整数。

在这种情况下,您可以使用NSNumberNSStringintegerValue中实施的常用方法。这将使您免于拨打isKindOfClass:和重拨。面向对象的编程就像1989年一样!

这样:

NSNumber *myNumber = @([myStringOrNumber integerValue]);

此操作的成本是它将已经是数字的对象转换为其他(但等效的)数字对象 * ,因此请将其考虑在内。一个小的性能/简单权衡。

*除了应用于NSNumber类的某些优化之外,因此对于每个覆盖的值,使用单个实例实现最低值的整数。在这种情况下,在绕过integerValueNSNumber构造函数之后,上面显示的代码行将生成完全相同的对象。

答案 1 :(得分:1)

NSNumber和NSString都响应返回int的方法-intValue。因此,您可以执行以下操作:

NSNumber *myNumber = @([[dictionary valueForKeyPath:@"key.path"] intValue]); // using modern Objective-C syntax