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

版本

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];

运行结果:
NSValue运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值