文章目錄
各種數值
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
}