美文网首页
使用@encode关键字判断NSNumber对象存储的数据类型

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

作者: 刘是丑 | 来源:发表于2016-08-04 17:45 被阅读205次

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

    • 前言
      我们经常会使用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]);
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:使用@encode关键字判断NSNumber对象存储的数据类型

          本文链接:https://www.haomeiwen.com/subject/dmocsttx.html