我有一个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"]];
这行得通,但似乎困扰很长,而且并不便宜。还有我没有考虑过的另一种方法吗?
最佳答案
假设您始终将数字读取为整数,那么我假设您的字符串仅包含整数。
在这种情况下,您可以使用在NSNumber
和NSString
中都实现的通用方法:integerValue
。这将使您免于调用isKindOfClass:
和繁重的分支。就像1989年一样的面向对象编程!
像这样:
NSNumber *myNumber = @([myStringOrNumber integerValue]);
此操作的成本是它将将已经是数字的对象转换为其他(但等效)数字对象*,因此请考虑到这一点。性能/简单性之间的折衷。
*除了对
NSNumber
类进行了一些优化之外,因此对于覆盖的每个值,都使用单个实例实现了最低值整数。在这种情况下,上面绕过integerValue
和NSNumber
构造函数绕行后,上面显示的代码行将产生完全相同的对象。
关于ios - 将值从字典转换为NSNumber,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17111661/