版权声明:本文为博主原创文章,未经博主允许不得转载。
前言
我们经常会使用NSNumber对象把我们需要的基本数据类型(比如Int,BOOL)存放到数组或者字典中,但是当我们想要反向取出这些对象的时候,并不能很好地区别它们对应的类型,如何才能判断它们的类型呢?举个栗子
NSDictionary *test = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], @"key1",
[NSNumber numberWithDouble:1.00f], @"key2",
[NSNumber numberWithInt:1], @"key3",
[NSNumber numberWithFloat:33.0f], @"key4", nil];
for (NSString *key in test) {
id value = [test valueForKey:key];
if([value isKindOfClass:[NSNumber class]]){
if(value isKindOfClass:[NSCFBoolean Class]){
NSLog(@"key = %@的值类型为布尔类型");
}
}
}
但是NSCFBoolean
苹果根本就没有把NSNumber抽象类的具体子类NSCFBoolean的API公布出来,所以这个时候,需要使用@encode关键字达到我们的目的。
@encode()
为了更好的互操作性,Objective-C 的数据类型,甚至自定义类型、函数或方法的元类型,都可以使用 ASCII 编码。@encode(aType) 可以返回该类型的 C 字符串(char *)的表示。
- 所以我们可以这样:
for (NSString *key in test) {
id value = [test valueForKey:key];
if([value isKindOfClass:[NSNumber class]]){
const char * objCType = [((NSNumber*)value) objCType];
if (strcmp(objCType, @encode(float)) == 0) {
NSLog(@"字典中key=%@的值是float类型,值为%f",key,[value floatValue]);
}
if (strcmp(objCType, @encode(double)) == 0) {
NSLog(@"字典中key=%@的值是double类型,值为%f",key,[value doubleValue]);
}
if (strcmp(objCType, @encode(int)) == 0) {
NSLog(@"字典中key=%@的值是int类型,值为%d",key,[value intValue]);
}
if (strcmp(objCType, @encode(BOOL)) == 0) {
NSLog(@"字典中key=%@的值是bool类型,值为%i",key,[value boolValue]);
}
}
}