2012年11月17日 星期六

神奇的@符號簡化語法

以前字符串可以這麼寫:
NSString *str = @"Hello";。

現在NSNumber也可以這麼寫:
NSNumber *number = @'H';
number = @1.2;
number = @YES;
number = @(60 * 60 * 24);

如果寫了這一行程式
id x = @42;

結果看到以下報錯
lit.m:3:8: error: initializer element is not a compile- time constant
id x = @42;
^~~

這到底是為什麼?因為對於整數是不能像字符串那樣處理的;這只是個讓程序員方便的語法而已,能讓我們創建一個autoreleased 的NSNumber物件。在Objective-C 11中,如果你定義下面這樣的macro,代碼如下:
#define N(x) _Generic((x), \
int : [NSNumber numberWithInt: x], \
float : [NSNumber numberWithFloat: x], \
double : [NSNumber numberWithDouble: x])

這個例子接受一個數值參數然後返回一個NSNumber的物件,以下的代碼都是等價的
x = N(12);
x = @12;

x = N(42.5);
x = @42.5;
x = N(42.5f);
x = @42.5f;

同理你也可以為long, longS以及long doubleS等等來擴展這樣的macro。甚至是更加複雜的數據。

沒有留言:

張貼留言