使用@encode关键字判断NSNumber对象存储的数据类型

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 前言
    我们经常会使用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]);
            }
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容