美文网首页
(四) IOS学习之--NSNumber & NSVal

(四) IOS学习之--NSNumber & NSVal

作者: CodingEleven | 来源:发表于2018-07-09 11:07 被阅读15次

    -NSNumber

    现在有一个问题,如果想把基本数据(比如NSInteger ,float,char,bool...)放进NSArray\NSDictionary中,但是NSArray\NSDictionary只能存放OC对象, 不能存放基本数据,因此需要把数据转成OC对象,NSNumber正好承担了这一封装任务.

    NSInteger num = 100 ;
    CGFloat f = 9.01 ;
    BOOL flag = YES;
    
    1. C基本类型转换成NSNumber
    NSNumber *intNum = [NSNumber numberWithInteger:num];
    NSNumber *floatNum = [NSNumber numberWithFloat:f];
    NSNumber *boolNum = [NSNumber numberWithBool:flag];
    NSLog(@"intNum=%@\rfloatNum=%@\rboolNum=%@",intNum,floatNum,boolNum);
    //intNum=100 floatNum=9.01 boolNum=1
    

    基本数据类型转成NSNumber后就可以存入NSArray\NSDictionary处理.

    2. NSNumber 转C基本类型
    NSInteger resInt = [intNum integerValue];
    CGFloat resFloat = [floatNum floatValue];
    BOOL resBool = [boolNum boolValue];
    NSLog(@"resultNum = %ld, resultFloat = %f, resultBool = %d",resInt,resFloat,resBool);
     //resultNum = 100, resultFloat = 9.010000, resultBool = 1
    
    3. NSNumber 转字符串
    NSString *str = [intNum stringValue];
    NSLog(@"%@",str);// str = "100"
    

    后续问题:弄懂NSInteger跟int区别,CGFloat跟float,double区别


    -NSValue

    NSNumber为基本类型提供了封装方法,那么NSValue主要用来封装数据结构,可以是系统框架提供的CGRect/CGPoint/CGSize等数据结构,也可以是自己定义的struct。

    1.NSValue跟OC结构体互转
    //声明一个NSRange结构体
    NSRange range = {9,1};
    //把NSRange结构体转换成OC对象
    NSValue *rangeValue = [NSValue valueWithRange:range];
    NSLog(@"%@",rangeValue); // NSRange: {9, 1}
    //把value转成结构体
    NSRange resRange = [rangeValue rangeValue];
    NSLog(@"location = %ld , length = %ld", resRange.location,resRange.length);//location = 9 , length = 1
    
    2.NSValue跟自定义结构体互转
    //定义一个struct cat
    struct cat{
         NSInteger age;
         CGFloat weight;
    };
    //实例化cat
    struct cat myCat = {3,16.0};
    //把自定义结构体转成NSValue
    //参数1:所转化结构体的地址
    //参数2:转化类型所对应的C字符串(@eccode(待转化类型))
    NSValue *catValue= [NSValue value:&myCat withObjCType:@encode(struct cat)];
            
    //把NSValue转成结构
    struct cat myCat1;
    [catValue getValue:&myCat1];
    NSLog(@"age=%ld,weight=%lf",myCat1.age,myCat1.weight); //age=3,weight=16.000000
    
    3.NSValue与结构体指针互转
    //实例化结构体指针
    struct cat *pCat = malloc(sizeof(struct cat));
    pCat -> weight =18;
    pCat -> age =4;
    //转换为NSValue
    NSValue *value1 = [NSValue value:pCat withObjCType:@encode(struct cat)];
            
    //转换回自定义结构体
    struct cat *pCat1 = malloc(sizeof(struct cat));
    [value1 getValue:pCat1];
    NSLog(@"age = %ld , weight = %lf",pCat->age,pCat->weight);//pCat -> weight =15;
    

    相关文章

      网友评论

          本文标题:(四) IOS学习之--NSNumber & NSVal

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