Xcode 4.4/4.5 新特性 / LLVM 4.0 新语法

跟着苹果干的好处就是,有什么新特性就尽快的就享用它们,这非常符常程序员们的学习心态。不像国内的某些技术领导,他们很领会某种舞台上的精髓 -- 稳定压倒一切 ,JDK 1.6 都出来了,还不少项目还牢牢固守在 JDK 1.3 上,程序员真是无言而又苦 B 啊。当然你在使用  Objective-C 时能时刻得到更新也得利于 Obj-C 完全由 Apple 主导,免了不少口水,瞧瞧 C++ 到 C++11,历时 13 年啊。

OK,言归正传,Xcode 当前版本 4.5.2,来看下自 4.4 以来它给我们带来了什么语言上的新特性。每个版本有新特性时一定要看官方的  What's New in Xcode。这么说来 Xcode 4.4 也算是个关键性的版本更新。

@ 不光可用于创建 NSString,还简单化了 NSNumber,NSArray 和  NSDictionary 对象的创建,一一来看。

@ 创建 NSNumber 实例

从 Xcode 4.4 起,无段  [NSNumber numberWithInt: 10] 这么写了,@10 就完事,下面是各种数值类型的 NSNumber 创建方式:

@ 创建 NSArray

现在有了增强的 @ 后一行代码就行了:

 看看 Xcode 4.4 之前你不得不这样:

@ 创建 NSDictionary

现在用  @ 创建 NSDictionary 的方式简单明了:

而 Xcode 4.4 之前是这样,你可能都会搞不清对应关系,还有那个 nil 尾巴也让人莫名奇妙:

使用 [] 下标对 NSArray 和  NSDictionary 中元素的存取

想想我们原来需要替换掉 NSMutableArray 和 NSMutableDictionary 中的某个元素必须像下面这么做:

上面新的 NSArray 和  NSDictionary 的访问方式原本就应该是这样第一直觉的。回顾下曾经我们是怎么做的:

上面那些用法就是 Modern Objective-C,想在老项目中跃跃欲试了吧。Xcode 4.4 为我们提供了迁移工具,Edit -> Refactor -> Convert to Modern Objective-C Syntax,Xcode 帮我们找到项目中所有上面的老语法,代之以新的语法,还有预览:

modern_objc_1

你只要点击 OK 按钮就行了,不过不知你注意到没有,转换时并没有认为 @synthesize 语句是可省略的,即使是写成 @synthesize foo; 也不认识。关于 @synthesize 我们接下来还会稍加说明。

@(expression) 盒子表达式,Boxed Expression

Boxed Expression 有人译作嵌套表达式,嵌套应该是  Nested,Boxed Expression 叫做盒子表达式,盒装表达式,或是装箱表达式感觉更妥一点,像 Java 的  Auto Boxing 翻译是自动装箱。Anyway,反正就是括号中的数值计算后再交给 @ 转成  NSNumber。

可省略的  @synthesize 语句

用过 Obj-C 时间长了,你是不是总觉得那个 @synthesize 是如此的多余,有 @property 不就明了了吗? 反正我以前就是这么认为的,我们的心思,Apple 懂的,Xcode 4.4 后 @synthesize 可省略了。比如 foo 属性没有写 @synthesize 语句,那么它默认就是:

Xcode 的 Modern Objective-C 转换工具不认为你自己写的 @synthesize 存在多余的可能性,大概它认为你会指定特别的内部变量名,或是动用了 @dynamic。

只要写了synthesis,无论有没有跟实例变量名,都将生成实例变量 ,如写成 @synthesize foo;那么实例变量名就是foo

 dynamic优先级高于synthesis,对于写了@dynamic的实现,所有的对应的synthesis都将不生效

用 block 遍历 NSArray 或  NSDictionary

像 NSArray 的 enumerateObjectsUsingBlock 等三个方法,和 NSDictionary 的 enumerateKeysAndObjectsUsingBlock 等两个方法。别说三两个都用等等等,看图吧:

modern_objc_3

modern_objc_2

除面以外,你也可以实现自己类的索引,下标方法,如自己对象的  testObject[1], 或 testObject["@key"],关键就是按需从中实现自己用得都会的方法:

- (id)objectAtIndexedSubscript: (NSUInteger)index;
 - (void)setObject: (id)obj atIndexedSubscript: (NSUInteger)index;
- (id)objectForKeyedSubscript: (id <NSCopying>)key;
  - (void)setObject: (id)anObject forKeyedSubscript: (id <NSCopying>)aKey;

详情见:Objective-C 实现自己的 Subscripting Methods 下标方法

参考: 1. What's New in Xcode
          2. Xcode 4.4/4.5 的新特性 | LLVM 4.0 的新语法
          3. xcode 4.5 new feature __ ios6 新特性
          4. Xcode 4.5 的新特性 | LLVM 4.0 的新语法

类别: iOS. 标签: , . 阅读(779). 订阅评论. TrackBack.

Leave a Reply

Be the First to Comment!

avatar