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行。心里还是很开心的,因为又可以少写一些体力活类型的代码了。

还是那句话,希望这些新特性能够让大家玩得开心。


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