objective-c之各种数值

各种数值

NSArray和NSDictionary都只能存储对象,不能存储任何基本类型的数据,如int,float,struct。因此我们可以用对象来封装基本的数值。

NSNumber

Cocoa提供了NSNumber来存储对象,但不能存储C里面的各种数据,所以我们要用一些相应的对象来进行封装。

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;

 

NSValue

NSNumber实际上是NSValue的子类,NSValue可以包装任意值,你可以用NSValue将结构放入NSArray和NSDictionary中,通过下列方法创建新的NSValue:

+ (NSValue *) valueWithBytes:(const void *) values

                objCType:(constchar*) type;

传递的参数是你想要包装的数值的地址(如一个NSSize或者你自己的struct)。通常,得到的是你想要存储的变量的地址,你也可以提供一个用来描述这个数据类型的字符串,通常用来说明struct中实体的类型和大小。如下例所示,将NSRect放入到NSArray中:

NSRect rect = NSMakeRect(1, 2, 30, 40);

NSValue *value;

value = [NSValue valueWithBytes: &rect

objCType: @encode(NSRect)];

[array addObject: value];

可以使用getValue:来提供数值:

- (void) getValue: (void *) vaule;

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

value = [array objectAtIndex:0];

[value getValue: &rect];

 

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];

 

NSNull

有时确实需要存一个NULL值,而大多数的对象里面是不允许存nil值的,那么使用NSNull就可以解决这个问题。

+ (NSNull *) null;

例:

[contact setObject:[NSNull null]

forKey:@”home fax machine”];

那么怎么进行访问及判断呢:

id homefax;

homefax = [contact objectForKey:@”home fax machine”];

 

if(homefax == [NSNull null])

{

//…no fax machine

}

posted @ 2016-01-25 16:59  抓狂的ZXY  阅读(197)  评论(0编辑  收藏  举报