我有一个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"]];
这很有效,但看起来很长,而且不是很便宜。还有其他方法我没有考虑过吗?
答案 0 :(得分:9)
鉴于你总是把你的数字读成整数,我认为你的字符串只能保持整数。
在这种情况下,您可以使用NSNumber
和NSString
:integerValue
中实施的常用方法。这将使您免于拨打isKindOfClass:
和重拨。面向对象的编程就像1989年一样!
这样:
NSNumber *myNumber = @([myStringOrNumber integerValue]);
此操作的成本是它将已经是数字的对象转换为其他(但等效的)数字对象 * ,因此请将其考虑在内。一个小的性能/简单权衡。
*除了应用于NSNumber
类的某些优化之外,因此对于每个覆盖的值,使用单个实例实现最低值的整数。在这种情况下,在绕过integerValue
和NSNumber
构造函数之后,上面显示的代码行将生成完全相同的对象。 子>
答案 1 :(得分:1)
NSNumber和NSString都响应返回int的方法-intValue
。因此,您可以执行以下操作:
NSNumber *myNumber = @([[dictionary valueForKeyPath:@"key.path"] intValue]); // using modern Objective-C syntax