Objective-C Foundation——各种数值

来源:互联网 发布:淘宝未来发展趋势 编辑:程序博客网 时间:2024/06/13 00:03

    NSArray和NSDictonary只能存储对象,而不能直接存储任何基本数据的数据,如int、float、或struct、但是我们可以用对象来封装基本数值。封装到一个对象中,然后就可以将这个对象放入了NSArray和NSDictonary中了。

<NSNumber>

可以封装基本数据类型:(如,int ,flot.bool,long等)封装成一个OC的对象,是类方法, 

封装 :术语是:装箱。

原型:

        +(NSNumber*)numberwithChar:(char)value;

        +(NSNumber*)numberwithInt:(int)value;

 注:只是列举了两个类型,还有其他的基本类型。

例:

NSMutableArray *arr=[NSMutableArray arrayWithCapacity:20];//创建可变数组。

        NSMutableDictionary *dict=[NSMutableDictionary dictionaryWithCapacity:20];//创建可变字典。

       NSNumber *number;

        number=[NSNumber numberWithInt:42];//封装成对象。

        [arraddObject:number];//把封装好的对象,插入到可变数组里

       NSLog(@"%@",arr);

        

        [dictsetObject:number forKey:@"lisi"];//把封装好的对象存到字典里。

       NSLog(@"%@",dict);



拆箱:从对象中提取基本类型的数据叫做拆箱,或叫(取消装箱)。
    原型:-(char)charValue;
        -(int)intValue;
        -(float)floatvalue;
        注:只是列举了两个类型,还有其他的基本类型。

例:

        NSLog(@"%d",[number intValue]);//拆箱成int

        NSLog(@"%lf",[number doubleValue]);//拆箱成doulbe型。会进行适当的类型转换。


          将创建方法和提取方法配对使用是完全可以的。例如,用numberWithFloat:创建的NSNumber可以用intValue来提取数值。NSNumber会对数据进行适当的转换。通常将一个基本类型的数据包装成对象叫做装箱(boxing),从对象中提取基本类型的数据叫做取消将箱(unboxing).这些语言有自动装箱功能,它可以自动包装基础类型的数据,也可以自动从包装后的对象中提取基础数据。Objectiv-c语言不支持自动装箱。




《NSValue》



            NSNumber 是NSValue的子类,NSV可以包装任意值。用NSValue可以将结构放入NSArray和NSDictionary中,使用下面的类方法创建新的NSVALue;

     原型:+(NSValue*)valueWithBytes:(const voe*)value  objCType:(const char *) type; 

    第一个参数是要包装的地址,第二个参数是要封装的类型。

     传递的参数是要包装的数值的地址(如一个NSSSize或自定义的struct)。通常,得到的是想要存储的变量的地址(在c语言中使用操作符&)。也可以提供一个用来描述这个数据类型的字符串,通常用来说明struct中实体的类型和大小,我们不需要自己写代码生成这个字符串。@encode编译器指令可以接收数据类型的名称并生成合适的字符串。


getVlue:来提取数值。

原型 -(void)getValue:(void*)value;

调用getValue时,要传递的是要存储这个数值的变量的地址。



        int a=10;

       NSValue *value=[NSValuevalueWithBytes:&a objCType:@encode(int)];//第一个参数是取变量的地址,第二个参数是数据类型。

       NSLog(@"%@",value);//通过,%@,是读不了值的。

       int c;

        [valuegetValue:&c];//使用getValue:是提取数值。

       NSLog(@"%d",c);



 

        

封装常用OC结构体方法

        

       NSRect rect={1,2,3,4};//创建结构体

       NSValue *value1=[NSValuevalueWithRect:rect];//封装

        NSMutableArray *array=[NSMutableArrayarrayWithCapacity:10];//创建可变数组,并估值

        [arrayaddObject:value1];//将封装好的对象,插入到可变数组里。

       NSLog(@"%@",array);

        

       NSValue *newValue=[array objectAtIndex:0];//objectAtIndex获取数组里面的元素。

       NSRect newRect;

        [newValuegetValue:&newRect];//取值。

        

       NSLog(@"%lf %lf %lf %lf",newRect.origin.x,newRect.origin.y,newRect.size.width,newRect.size.height);



自己定义的结构体封装

        struct ststudent

        {

            char name[20];

            int ID;

        };

        struct ststudent stu={"jome",1000};

        NSValue *value5=[NSValuevalueWithBytes:&stuobjCType:@encode(structststudent)];//封       装,第一个参数是&stu的地址,第二个参数是结构体的类型。

        NSMutableArray *arr;//建立动态数组。

        arr=[NSMutableArrayarrayWithCapacity:20];//动态数组的估值。

        [arr addObject:value5];//在数组末尾添加对象。

        NSValue *newValue5 = [arr objectAtIndex:0];//取数组中的第一个元素,并封装。

        struct ststudent newStu;//定义新的结构体变量。

        [newValue5getValue:&newStu];//提取数值。

        NSLog(@"%s %d",newStu.name,newStu.ID);




《NSull》

       我们提到过不能在集合在放入nil值,因为在NSArray和NSDictionary中nil有特殊的含义。但有时确实需要存储一个表示“这里什么都没有”的值。

+(NSUll*)null;



NSMutableDictionary *mGlossary=[NSMutableDictionary dictionaryWithCapacity:20];

        

        [mGlossary setObject:[NSNull nullforKey:@"home fax machine"];

        id homefax;

        homefax=[mGlossary objectForKey:@"home fax machine"];

        if (homefax==[NSNull null])

        {

            NSLog(@"right");

        }

原创粉丝点击