天天看點

黑馬程式員---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