跟着苹果干的好处就是,有什么新特性就尽快的就享用它们,这非常符常程序员们的学习心态。不像国内的某些技术领导,他们很领会某种舞台上的精髓 -- 稳定压倒一切 ,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 创建方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// char NSNumber *theLetterZ = @'Z'; // [NSNumber numberWithChar:'Z'] // Integer NSNumber *fortyTwo = @42; // [NSNumber numberWithInt:42] NSNumber *ftUnsigned = @42U; // [NSNumber numberWithUnsignedInt:42U] NSNumber *ftLong = @42L; // [NSNumber numberWithLong:42L] NSNumber *ftLongLong = @42LL; // [NSNumber numberWithLongLong:42LL] // Float NSNumber *piFloat = @3.141592F;// [NSNumber numberWithFloat:3.141592F] NSNumber *piDouble = @3.141592;// [NSNumber numberWithDouble:3.141592] // Boolean NSNumber *yesNumber = @YES; // [NSNumber numberWithBool:YES] NSNumber *noNumber = @NO; // [NSNumber numberWithBool:NO] |
@ 创建 NSArray
现在有了增强的 @ 后一行代码就行了:
1 |
NSArray *items = @[ @"item1", @YES, @12 ]; |
看看 Xcode 4.4 之前你不得不这样:
1 2 3 |
NSArray *items = [NSArray arrayWithObjects:@"item1", [NSNumber numberWithBool:YES], [NSNumber numberWithInt:12], nil]; |
@ 创建 NSDictionary
现在用 @ 创建 NSDictionary 的方式简单明了:
1 2 3 4 5 |
NSDictionary *options = @{ @"backup": @YES, @"daysToKeepBackup": @7, @"flags": @"foo" }; |
而 Xcode 4.4 之前是这样,你可能都会搞不清对应关系,还有那个 nil 尾巴也让人莫名奇妙:
1 2 3 4 |
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], @"backup", [NSNumber numberWithInt:7], @"daysToKeepBackup", @"foo", @"flags", nil]; |
使用 [] 下标对 NSArray 和 NSDictionary 中元素的存取
1 2 3 4 |
items[0]; options[@"backup"]; items[0] = @23; //如果 items 是一个 NSMutableArray options[@"backup"] = @NO; //如果 options 是一个 NSMutableDictionary |
想想我们原来需要替换掉 NSMutableArray 和 NSMutableDictionary 中的某个元素必须像下面这么做:
1 2 |
[items replaceObjectAtIndex:i withObject:newObj] [options setObject: newObj forKey: key] |
上面新的 NSArray 和 NSDictionary 的访问方式原本就应该是这样第一直觉的。回顾下曾经我们是怎么做的:
1 2 |
[items objectAtIndex: 0]; [options objectForKey: @"backup"]; |
上面那些用法就是 Modern Objective-C,想在老项目中跃跃欲试了吧。Xcode 4.4 为我们提供了迁移工具,Edit -> Refactor -> Convert to Modern Objective-C Syntax,Xcode 帮我们找到项目中所有上面的老语法,代之以新的语法,还有预览:
你只要点击 OK 按钮就行了,不过不知你注意到没有,转换时并没有认为 @synthesize 语句是可省略的,即使是写成 @synthesize foo; 也不认识。关于 @synthesize 我们接下来还会稍加说明。
@(expression) 盒子表达式,Boxed Expression
Boxed Expression 有人译作嵌套表达式,嵌套应该是 Nested,Boxed Expression 叫做盒子表达式,盒装表达式,或是装箱表达式感觉更妥一点,像 Java 的 Auto Boxing 翻译是自动装箱。Anyway,反正就是括号中的数值计算后再交给 @ 转成 NSNumber。
1 2 |
NSNumber *total = @(0.2f - 1.9f); //[NSNumber numberWithFloat:0.2f - 1.9f] NSNumber *piOT = @(M_PI / 2); //[NSNumber numberWithDouble:(M_PI / 2)] |
可省略的 @synthesize 语句
用过 Obj-C 时间长了,你是不是总觉得那个 @synthesize 是如此的多余,有 @property 不就明了了吗? 反正我以前就是这么认为的,我们的心思,Apple 懂的,Xcode 4.4 后 @synthesize 可省略了。比如 foo 属性没有写 @synthesize 语句,那么它默认就是:
1 |
@synthesize foo = _foo; |
Xcode 的 Modern Objective-C 转换工具不认为你自己写的 @synthesize 存在多余的可能性,大概它认为你会指定特别的内部变量名,或是动用了 @dynamic。
只要写了synthesis,无论有没有跟实例变量名,都将生成实例变量 ,如写成 @synthesize foo;那么实例变量名就是foo
dynamic优先级高于synthesis,对于写了@dynamic的实现,所有的对应的synthesis都将不生效
用 block 遍历 NSArray 或 NSDictionary
像 NSArray 的 enumerateObjectsUsingBlock 等三个方法,和 NSDictionary 的 enumerateKeysAndObjectsUsingBlock 等两个方法。别说三两个都用等等等,看图吧:
除面以外,你也可以实现自己类的索引,下标方法,如自己对象的 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 的新语法
本文链接 https://yanbin.blog/xcode-4-4-4-5-new-features/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。