美文网首页
iOS开发之基础篇(5)—— NSNumber、NSValue

iOS开发之基础篇(5)—— NSNumber、NSValue

作者: 看影成痴 | 来源:发表于2017-11-07 17:58 被阅读22次

    版本

    Xcode 8.2.1

    一、NSNumber

    前文说过,NSArray和NSDictionary只能存入OC对象。不信我们可以做个试验:将一个int类型或者是NSInteger放入NSMutableArray里面。(NSInteger和int的差别:NSInteger会根据系统的位数32or64,自动选择int的最大数值int or long,这样我们就不用考虑设备是32位还是64位系统)

    NSMutableArray *arr = [[NSMutableArray alloc] init]; 
    [arr addObject:100];     //编译出错
    

    这样是会编译出错的,存入不成功。
    那怎么办呢?所以,我们需要将int或者NSInteger类型转换成NSNumber(OC对象),然后再存入NSArray中。
    NSNumber可以转换一系列的基础数字类型(char、int、float、long、bool等等),还提供了一个compare方法来将NSNumber对象进行数值排序。
    我们来看看NSNumber有哪些要掌握的知识点:

        NSInteger num = 100;
        CGFloat f = 3.33;
        BOOL flag = YES;
    
        //C的基本类型转换成NSNumber对象
        NSNumber *numInte = [NSNumber numberWithInteger:num];
        NSNumber *numFlo = [NSNumber numberWithFloat:f];
        NSNumber *numBool = [NSNumber numberWithBool:flag];
        NSLog(@"numInteger = %@, numFloat = %@, numBool = %@",numInte,numFlo,numBool);
    
        //NSNumber转换成C的基本类型
        NSInteger resultNum = [numInte integerValue];
        NSString *str33 = [numInte stringValue];  //NSNumber转NSString
        CGFloat resultFloat = [numFlo floatValue];
        BOOL resultBool = [numBool boolValue];
        NSLog(@"resultNum = %ld, str33 = %@, resultFloat = %f, resultBool = %d",resultNum,str33,resultFloat,resultBool);
    

    运行结果如下:

    总结:

    1. 将数值转化为NSNumber的语法:
      NSNumber *NSNumber对象名 = [NSNumber numberWith数字类型:数值];
    2. 将NSNumber转化为数值类型:
      基本数字类型 类型对象 = [NSNumber对象 基本数字类型Value];

    二、NSValue

    之所以把NSNumber和NSValue放到同一篇,是因为NSNumber是NSValue的子类,NSValue除了能够包装NSNumber能够包装的基础数字类型外,还能够包装系统框架提供的CGRect/CGPoint/CGSize等数据结构,也可以是自己定义的struct。最终也能放入数组。

    • 封装方法:
      + (NSValue )valueWithBytes:(const void )value objCType:(const char *)type;
    • 解封方法:
      - (void)getValue:(void *)value;

    同样,我们来看看它的应用:

        //声明一个NSRange结构体
        NSRange range = {9,1};
    
        //把NSRange结构体快速的转换成为OC的对象
        NSValue *value = [NSValue valueWithRange:range];
        NSLog(@"NSValue = %@",value);
    
        //把Value对象转换回NSRange结构体
        NSRange result0Range = [value rangeValue];
        //    NSRange result0Range = value.rangeValue;
        NSLog(@"location = %ld length = %ld",result0Range.location,result0Range.length);
    
        //自定义一个结构体
        struct cat {
            NSInteger weight;
        };
    
        //实例化一个struct cat
        struct cat myCat = {900};
    
        //把自定义的结构体转换成为NSValue
        //参数1: 所转化结构体的地址
        //参数2: 转化类型所对应的C字符串(@encode(待转化类型))
        NSValue *catValue = [NSValue value:&myCat withObjCType:@encode(struct cat)];
        NSLog(@"catValue = %@",catValue);
    
        //NSValue转换回自定义结构体
        //实例化一个接收的实体
        struct cat myCat1;
    
        //需要接收实体的地址
        [catValue getValue:&myCat1];
        NSLog(@"myCat1.weight = %ld",myCat1.weight);
    
        //使用结构体指针
        struct cat *pCat = malloc(sizeof(struct cat));
        pCat -> weight =10;
        //转换为NSValue
        NSValue *value1 = [NSValue value:pCat withObjCType:@encode(struct cat)];
    
        //转换回自定义结构体
        struct cat *pCat1 = malloc(sizeof(struct cat));
        [value1 getValue:pCat1];
    

    运行结果:

    相关文章

      网友评论

          本文标题:iOS开发之基础篇(5)—— NSNumber、NSValue

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