1. NSArray 和 NSDictionary只能存储对象,而不能存储任何基本类型的数据,如int,float和struct,不过你可以用对象来封装基本数据。比如,将int型基本数据封装到一个对象中,就可以将这个对象放入NSArray和NSDictionary。
1.1.0 NSNumber
Cocoa提供了NSNumber类来封装,即以对象形式来实现基本数据类型。
+(NSNumber *)numberWithChar:(char)value;
+(NSNumber *)numberWithInt:(int)int;
+(NSNumber *)numberWithFloat:(float)value;
+(NSNumber *)numberWithBool:(bool)value;
也可以用字面量的语法来创建这些对象:
NSNumber *number;
number = @'X' //字符型
number = @12345 //整型
number = @123.45f //浮点型
number = @YES //布尔型
在将一个基本数据类型封装到NSNumber中后,你可以通过下面的实例方法获得它。
-(char)charValue;
-(int)intValue;
-(BOOL)boolValue;
-(NSString *)stringValue;
说明: 通常将一个基本类型的数据封装成对象的过程被称为装箱 (boxing),从对象中提取基本类型的数据叫做开箱。有些语言具有自动装箱的功能,可以自动封装基础类型的数据,也可以自动从封装后的对象中提取基础数据。Objective-C语言不支持自动装箱功能。
2. NSValue
NSNumber实际上是NSValue的子类,NSValue可以封装任意值。你可以使用NSValue将结构体放入NSArray或者NSDictionary中。
+(NSValue)valueWithBytes:(const void *)value objCType:(const char *)type;
传递的参数是你想要封装的数值的地址(如一个NSSize或你自己的struct).通常你得到的是想要存储的变量的地址(在C语言中要使用操作符&)。你也可以提供一个用来描述这个数据类型的字符串,通常用来说明struct中实体的类型和大小。你不用自己写代码来生成这个字符串, @encode编译器指令可以接收数据类型的名称并为你生成合适的字符串。
NSRect rect = NSMakeRect(1,2,30,40);
NSValue *value = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)];
[array addObject:value];
可以使用方法getValue:来提取数值: -(void)getValue:(void *)buffer;