Xcode 4.4/4.5 的新特性 | LLVM 4.0 的新語法

在最新的 Xcode 4.4 中,增加了許多新特性。其中包括更方便的代碼輸入,這得益於 LLVM 編譯器 4.0 的更新。這一更新可大大提高寫代碼的效率。

1. 所有的 NSNumber 表達

從 Xcode 4.4 起,所有的 [NSNumber numberWithInt: 10] 之類的表達現在都可以寫作 @10,如:

// 單個字符
NSNumber *theLetterZ = @'Z';   // 相當於 [NSNumber numberWithChar:'Z']

// 整形
NSNumber *fortyTwo = @42;      // 相當於 [NSNumber numberWithInt:42]
NSNumber *ftUnsigned = @42U;   // 相當於 [NSNumber numberWithUnsignedInt:42U]
NSNumber *ftLong = @42L;       // 相當於 [NSNumber numberWithLong:42L]
NSNumber *ftLongLong = @42LL;  // 相當於 [NSNumber numberWithLongLong:42LL]

// 浮點
NSNumber *piFloat = @3.141592F;// 相當於 [NSNumber numberWithFloat:3.141592F]
NSNumber *piDouble = @3.141592;// 相當於 [NSNumber numberWithDouble:3.141592]

// 是 / 否
NSNumber *yesNumber = @YES;    // 相當於 [NSNumber numberWithBool:YES]
NSNumber *noNumber = @NO;      // 相當於 [NSNumber numberWithBool:NO]

 

2. 新的 NSArray, NSDictionary 輸入方法

以前想要創建一個新的 NSDictionary, 你必須不厭其煩地輸入:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], @"backup",
                         [NSNumber numberWithInt:7],    @"daysToKeepBackup",
                         @"foo",                        @"flags", nil];

現在只用輸入:

NSDictionary *options = @{
    @"backup": @YES,
    @"daysToKeepBackup": @7,
    @"flags": @"foo"
};

就可以達到同樣的效果。

NSArray 的輸入方法也變得更簡單:之前的

NSArray *items = [NSArray arrayWithObjects:@"item1",
                  [NSNumber numberWithBool:YES],
                  [NSNumber numberWithInt:12], nil];

現在只用輸入:

NSArray *items = @[ @"item1", @YES, @12 ];

 補充:

怎麼樣?是不是簡單多了?而且,爲了方便你的舊代碼遷移到新的寫法,xcode專門還提供了轉換工具,在xcode4.4中,選擇 Edit -> Refactor -> Convert to Modern Objective-C Syntax即可。如下所示: 

3. 嵌套表達式 (Boxed Expressions)

最新版本的 Objective-C 還提供了一種新的書寫方式:

@( expression )

BOOL 和 int 的結果有時候需要被計算才能得到。這時候你便可以將表達式放入一對括號中。比如:

NSNumber *total = @(0.2f - 1.9f); //[NSNumber numberWithFloat:0.2f - 1.9f]
NSNumber *piOT = @(M_PI / 2);     //[NSNumber numberWithDouble:(M_PI / 2)]

 

4. 創建新 property 不用再合成

升級到 Xcode 4.4 後,在頭文件中創建的 @property 均無需再進行 @synthesize。Xcode 將自動合成。

@synthesize object = _object;

 

5. 注意

以上新特性只有當你升級到 Xcode 4.4 最新版本纔可獲得。早期 Xcode 使用這種語法會出現編譯錯誤。


補充:

遍歷元素

你是如何遍歷數組的元素的?通常我們有2種做法,一種是用 for in,另一種是用一個變量來循環數組下標。如下:

1
2
3
4
5
6
7
8
    NSArray * lines = ...
    for (NSString * line in lines) {
       // ...
    }
    for (int i = 0; i < lines.count; ++i) {
        NSString * s = [lines objectAtIndex:i];
        ...
    }

如果是字典,遍歷的代碼就要稍微複雜一點了:

1
2
3
4
5
6
    NSDictionary * dict = 
    NSArray * keys = [dict allKeys];
    for (NSString * key in keys) {
        NSString * value = [dict objectForKey:key];

    }

現在,xcode對於iOS4.0以上的系統,支持用block來遍歷元素了。用block來遍歷字典可以簡化代碼的編寫,建議大家都使用上這個新特性。

1
2
3
4
5
6
7
[lines enumerateObjectsUsingBlock:^(NSString * obj, NSUInteger idx, BOOL *stop) {

}];

[_urlArguments enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

}];

Subscripting Methods

這個新特性在WWDC2012的視頻中提到了,但是在XCode4.4中沒有實現(在XCode4.5中實現了)。也是一個很體貼的語法糖,它允許你用中括號來代替原本的方法來獲取和設置數組元素。

簡單來說,以前的 [array objectAtIndex:idx] 和 [array replaceObjectAtIndex:idx withObject:obj],可以直接寫作 array[idx] 和 array[idx] = obj了。其實這個特性在很多高級語言中都實現了,只是Objective-C生於80年代,一直沒改進這個。

以下是一些示例代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
NSArray * array = @[ @"111", @"222", @"333"];
for (int i = 0; i < 3; ++i) {
    NSLog(@"array[i] = %@", array[i]);
}

NSMutableDictionary * dict =[@{  @1: @"value1",
                                 @2: @"value2",
                                 @3: @"value3" } mutableCopy];
for (int i = 0; i < 3; ++i) {
    NSLog(@"dict[%d] = %@", i, dict[@(i+1)]);
    dict[@(i+1)] = [NSString stringWithFormat:@"new %@", dict[@(i+1)]];
}

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    NSLog(@"dict[%@] = %@", key, dict[key]);
}];

這個改進同樣對NSDictionary有效。甚至,你也可以給你自己的類提供中括號操作符對應的方法。具體做法是實現如下兩個方法:

1
2
- (id)objectAtIndexedSubscript:(NSUInterger)idx;
- (void)setObject:(id)value atIndexedSubscript:(NSUInteger)idx;

Tips

上面提到了不用寫 @synthesize 了,那原本寫的那麼多 @synthesize 怎麼辦呢?作爲有代碼潔癖的我很想把它們刪掉,但怎麼刪呢?一個文件一個文件打開,然後行一行刪掉嗎?放心,蘋果已經幫我們想了解決方案。在WWDC2012 Session 400 Developer Tools Kickoff 中,蘋果介紹了具體做法。步驟如下:

  1. 首先使用區域查找,因爲一般項目都會依賴第三方的開源庫,我們可不想更改別人的庫,所以我們只查找我們庫中的文件,如下圖所示:

  1. 接着我們用正則匹配,找到以 @synthesize開頭,後面接着是 var = _var; 格式的行。插入正則表達式很簡單,直接點擊查找輸入框左邊的放大鏡,選擇“insert pattern”,蘋果就會把常見的正則表達式都列出來,你直接選擇就可以了,非常方便。如下圖所示:

在插入好合適的正則表達式後,我們按回車,就可以搜索到結果。

  1. 我們點擊搜索界面的preview按鈕,查看替換效果,可以看到,對於我們測試代碼,XCode生成的預覽圖已經正確地當對應代碼刪掉了。然後我們就可以點擊替換,去掉所有的 @synthesize 代碼了。

在下載完XCode4.4後,我就把我們的工程代碼都轉換成了新特性的語法。在轉換後,我發現原本25000行的代碼少了將近1000行。心裏還是很開心的,因爲又可以少寫一些體力活類型的代碼了。

還是那句話,希望這些新特性能夠讓大家玩得開心。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章