5.各种数值
NSArray和NSDictionary只能存储对象,而不能直接存储任何基本类型的数据,如int、float 或 struct。但是你可以用对象来封装基本数值。例如,将int型数据封装到一个对象中,然后就可以将这个对象放入NSArray或NSDictionary中了。
1)NSNumber
Cocoa提供了NSNumber类来包装(即以对象形式实现)基本数据类型。
例如以下创建方法:
+ (NSNumber * ) numberWithChar: ( char ) value;
+ (NSNumber * ) numberWithInt: ( int ) value;
+ (NSNumber * ) numberWithFloat: ( float ) value;
+ (NSNumber * ) numberWithBool: (BOOL) value;
将基本类型数据封装到NSNumber中后,就可以通过下面的实例方法重新获取它:
- ( char ) charValue;
- ( int ) intValue;
- ( float ) floatValue;
- (BOOL) boolValue;
- (NSString * ) stringValue;
2)NSValue
NSNumber实际上是NSValue的子类,NSValue可以包装任意值。可使用下面的类方法创建新的NSValue:
+ (NSValue * ) valueWithBytes: ( const void * ) value
objCType: ( const char * ) type;
// 将NSRect放入NSArray中
NSRect rect = NSMakeRect( 1 , 2 , 100 , 200 );
NSValue * rectValue = [NSValue valueWithBytes: & rect
objCType:@encode(NSRect)];
[array addObject:rectValue];
// 使用getValue提取数值
// 传递参数为要存储这个数值的变量的地址
rectValue = [array objectAtIndex: 0 ];
[rectValue getValue: & rect];
在上面的getValue: 例子中,方法名中的get表明我们提供的是一个指针,而指针所指向的空间用来存储该方法生成的数据。
Cocoa提供了将常用的struct型数据转换成NSValue的便捷方法:
+ (NSValue * ) valueWithPoint: (NSPoint) point;
+ (NSValue * ) valueWithSIze: (NSSize) size;
+ (NSValue * ) valueWithRect: (NSRect) rect;
- (NSPoint) pointValue;
- (NSSize) sizeValue;
- (NSRect) rectValue;
value = [NSValue valueWithRect: rect];
[array addObject: value];
// ….
NSRect anotherRect = [value rectValue];
3)NSNull
因为在NSArray和NSDictionary中nil中有特殊的含义(表示列表结束),所以不能在集合中放入nl值。如要确实需要存储一个表示“什么都没有”的值,可以使用NSNull类。NSNull只有一个方法:
+ (NSNull * ) null ;
[contact setObject: [NSNull null ] forKey: @" home fax " ];
id homefax;
homefax = [contact objectForKey: @" home fax " ];
if (homefax == [NSNull null ]
{
// ...
}