1

我有一个 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"]];

这行得通,但它似乎很冗长而且不是很便宜。还有其他我没有考虑过的方法吗?

4

2 回答 2

11

鉴于您总是将数字读取为整数,我假设您的字符串仅包含整数。

在这种情况下,您可以使用在NSNumberNSString:中实现的通用方法integerValue。这将使您免于调用isKindOfClass:和繁重的分支。面向对象编程就像 1989 年一样!

像这样:

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

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

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

于 2013-06-14T15:17:10.343 回答
2

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

NSNumber *myNumber = @([[dictionary valueForKeyPath:@"key.path"] intValue]); // using modern Objective-C syntax
于 2013-06-14T15:17:00.537 回答