Objective-C邊學邊記-10:Foundation Kit快速教程之 各種數值(NSNumber,NSValue,NSNull

來源:互聯網
上載者:User

5.各種數值
NSArray和NSDictionary只能儲存物件,而不能直接儲存任何基本類型的資料,如int、float 或 struct。但是你可以用對象來封裝基本數值。例如,將int型資料封裝到一個對象中,然後就可以將這個對象放入NSArray或NSDictionary中了。
1)NSNumber
Cocoa提供了NSNumber類來封裝(即以對象形式實現)基礎資料型別 (Elementary Data Type)。
例如以下建立方法:

+ (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;

 

術語:將一個基本類型的資料封裝成對象叫做裝箱(boxing),從對象中提取基本類型的資料叫做unboxing或拆箱(unboxing)。Objective-C不支援自動裝箱。

2)NSValue
NSNumber實際上是NSValue的子類,NSValue可以封裝任意值。可使用下面的類方法建立新的NSValue:

+ (NSValue *) valueWithBytes: (const void *) value
objCType: (const char *) type;

 

傳遞的參數是你想要封裝的數值的地址(如一個NSSize或你自己的struct),通常得到的是你想要儲存的變數的地址(在C語言中使用操作符&).你也可以提供一個用來描述這個資料類型的字串(參數objCType),通常用來說明struct中實體的類型和大小。不需要自己寫這個字串,@encode編譯器指令可以接收資料類型的名稱並產生合適的字串。所以按照如下方式把NSRect放入NSArray中:
   

    // 將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]
{
//...
}

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.