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);
例:
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);
NSMutableDictionary *mGlossary=[NSMutableDictionary dictionaryWithCapacity:20];
[mGlossary setObject:[NSNull null] forKey:@"home fax machine"];
id homefax;
homefax=[mGlossary objectForKey:@"home fax machine"];
if (homefax==[NSNull null])
{
NSLog(@"right");
}