天天看点

黑马程序员---OC学习笔记之NSNumber和NSValue的介绍和使用一、NSNumber的使用二、NSValue的介绍和使用

——Java培训、Android培训、iOS培训、.Net培训——–

一、NSNumber的使用

1、NSNumber的介绍和使用

NSArray和NSDictionary中只能存放OC对象,不能存放int,float,double等基本数据类型。如果真想把基本数据放进数组或字典中,需要先将基本数据【包装】成OC对象

NSNumber可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进NSArray和N

SDictionary中

2、使用

//NSNumber的使用
        //【好处】可以把基本数据类型存放到 数组和字典中
        //如何使用NSNumber
        //1)int --->NSNumber
        int a = ;
        NSNumber *intObj = [NSNumber numberWithInt:a];
        NSMutableArray *arr = [NSMutableArray arrayWithObject:intObj];
        NSLog(@"%@",arr);
        //2)float --->NSNumber
        float b = f;
        intObj = [NSNumber numberWithFloat:b];
        [arr addObject:intObj];
        NSLog(@"%@",arr);

        //3)如果此时让数组中的两个元素相加
        //显然arr[0]+arr[1]是不行的
        //step1:取出数组的元素
        //step2:把元素转换成基本数据类型的数据
        NSNumber *ns1 = arr[];
        NSNumber *ns2 = arr[];
        int a1 = [ns1 intValue];
        float b1 = [ns2 floatValue];

        NSLog(@"a1 + b1 = %.2f",a1+b1);

        //4)NSNumber简写方式
        int c = ;
        //@(变量名)把基本数据类型转换成NSNumber对象
        [arr addObject:@(c)];
        //@(数值)把数值转换成NSNumber对象
        [arr addObject:@];
        NSLog(@"%@",arr);
           

【打印结果】

2015-10-08 21:01:43.474 NSNumber的使用[8143:303] (

12

)

2015-10-08 21:01:43.477 NSNumber的使用[8143:303] (

12,

“12.2”

)

2015-10-08 21:01:43.478 NSNumber的使用[8143:303] a1 + b1 = 24.20

2015-10-08 21:01:43.479 NSNumber的使用[8143:303] (

12,

“12.2”,

100,

14

)

二、NSValue的介绍和使用

1、NSValue的介绍和使用

1)NSNumber是NSValue的子类,NSValue主要用来把指、CGRect结构体等包装成OC对象,以便存储。

2)一个NSValue对象是用来存储一个C或者Objective-C数据的简单容器。它可以保存【任意类型的数据】,比如int、float、char,当然也可以是指pointers、structures 和objects 、ids。NSValue类的目标就是允许以上数据类型的数据结构能够被添加到集合中,例如那些需要其他元素对象是的数据结构,如NSArray或者NSSet的实例。需要注意的是NSValue对象一直是【不可枚举】的。

为了方便 【结构体】和NSValue的转换,Foundation提供了一下方法将结构体包装秤NSValue对象—–》存储结构体到集合中

2、使用如下:

//创建一个结构体,保存点
        CGPoint p  = CGPointMake(, );
        //创建一个矩形
        CGRect r = CGRectMake(, , , );
        //创建一个size
        CGSize s = CGSizeMake(, );

        NSMutableArray *ma = [NSMutableArray array];
        //[ma addObject:p];报错,基本数据类型不能保存到数组中
        //1)valueWithPoint 将point结构体转换成NSValue对象
        NSValue *value = [NSValue valueWithPoint:p];
        [ma addObject:value];
        value = [NSValue valueWithRect:r];
        [ma addObject:value];
        value = [NSValue valueWithSize:s];
        [ma addObject:value];
        NSLog(@"%@",ma);


        //2)将NSValue中的值去出来
        NSValue *value2 = [ma lastObject];
        NSSize ns = [value2 sizeValue];
        NSLog(@"%@",NSStringFromSize(ns));



        //3)把自定义的结构体存储到NSArray中

        typedef struct {
            int year;
            int month;
            int day;
        }myDate;

        myDate d = {,,};
        //[ma addObject:d];报错,基本数据类型
        //@encode(myDate)把myDate类型生成一个常量字符串描述

        value2 = [NSValue valueWithBytes:&d objCType:@encode(myDate)];
        [ma addObject:value2];
        NSLog(@"%@",ma);

        //4)把自定义结构体的值从数组中取出来
        //getValue获取值
        myDate d2;
        [value2 getValue:&d2];
        NSLog(@"%d-%d-%d",d2.year,d2.month,d2.day);
           

【打印结果】

2015-10-08 21:28:46.822 NSValue的使用[8732:303] (

“NSPoint: {10, 19}”,

“NSRect: {{2, 2}, {2, 2}}”,

“NSSize: {2, 2}”

)

2015-10-08 21:28:46.827 NSValue的使用[8732:303] {2, 2}

2015-10-08 21:28:46.829 NSValue的使用[8732:303] (

“NSPoint: {10, 19}”,

“NSRect: {{2, 2}, {2, 2}}”,

“NSSize: {2, 2}”,

“”

)

2015-10-08 21:28:46.831 NSValue的使用[8732:303] 2014-12-31