OC的NSNumber有一个很坑的地方,比如BOOL型的基础数据类型,如果转成NSNumber,那么你取出来就是@1和@0了,那你就无法知道这个NSNumber原始的数据类型到底是BOOL还是Int或者long了。
所以我写了个方法来判断NSNumber的原始类型,如下:
+ (int ) originTypeFromNumber: (id) data {
// 判断是不是数字类型
if ([data isKindOfClass:[NSNull class]]) {
return -1;
}
int type = -1;
if([data isKindOfClass:[NSNumber class]])
{
if (strcmp([data objCType], @encode(float)) == 0)
{
type = 1;
}
else if (strcmp([data objCType], @encode(double)) == 0)
{
type = 2;
}
else if (strcmp([data objCType], @encode(int)) == 0)
{
type = 3;
}
else if (strcmp([data objCType], @encode(BOOL)) == 0)
{
type = 4;
}else if (strcmp([data objCType], @encode(long)) == 0)
{
type = 5;
}
else{
type = -1;
}
}
return type;
}
例如你从网络上获取的JSON数据,存到了字典里,这时候,你想判断这个值的原始类型,那么就传入data,就可以根据返回的type来判断了。注意本方法只针对判断NSNumber类型的原始数据类型,因为其他的类型OC是可以分辨的。