注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

木子月

Lixm Studio

 
 
 

日志

 
 

Xcode 4.4中LLVM compiler 4.0带来的Objective-C新语法特性  

2012-09-19 17:20:03|  分类: 程序 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
FreeBSD用Clang取代了GCC,在过去的几年里,我们一直致力于用Clang取代GCC,成为默认编译器。并打算在i386和amd64平台上,把Clang作为FreeBSD 10.0的默认编译器。为此,将在10月4日为i386和amd64平台上的”WITH_CLANG_IS_CC“设置默认值。

今年WWDC 2012苹果全球开发者大会上,苹果针对LLVM编译器都做了重大改进,新版的Xcode 4.4中的LLVM编译器升级到了4.0,给Objective-C带来了很多令人惊喜的特性

1、枚举类型的改变

老写法:

typedef enum Week{  
    Moday,  
    Tuesday,  
    Wednesday,  
    Thursday,  
    Friday,  
    Saturday,  
    Sunday      
}Week;  

新写法:

typedef enum Week:NSUInteger{  
    Moday,  
    Tuesday,  
    Wednesday,  
    Thursday,  
    Friday,  
    Saturday,  
    Sunday      
}Week;  

2、使用的方法代码放置的位置顺序无关
没在.h文件中声明的方法,有的时候如果方法不在前面,可能会有警告。

[cpp] view plaincopy
@interface MyClass : NSObject  
-(void)doSomething:(NSString *) print;  
@end  


实现:

@implementation MyClass  
-(void)doSomething:(NSString *)print{  
    NSLog(@"%@", [print stringByAppendingFormat:[self getString]]);  
}  
-(NSString *)getString{  
    return@"string for something";  
}  
@end  

早期编译器编译时会出现:warning: instance method ‘-getString:’ not found…
新的编译器会先扫描代码中的方法,然后再编译,这样就避免了找不到方法这种情况了

3、property属性简化

@property对于使用Objective-C的程序员来说是相当熟悉的,property方便自动生成变量的getter 和setter。在.h文件中声明之后,还要在.m文件中加上@synthesize关键字,这样才能完成自动getter 和setter的过程。

比如说,我在.h文件中写了

@property (strong, nonatomic) NSDictionary *order;
我还要去对于的.m文件中写上
@synthesize order;
是不是感觉很多余啊?现在在语法新特性中不用写这行代码了,新版的编译器帮你实现这行代码,这叫帮人帮到底。
也是说,你在.h文件中声明order属性后,就可以直接在实现文件中使用该属性的getter和setter方法,编译器还会根据属性

的可读和可写自动判断是否提供setter方法。智能多了。

4、语法的简化
做过java 或C#开发的都知道,初始化或赋值一个变量一般用一个“=”号就搞定了,到了Objective-C后,每次都要用一个很长的函数才能赋值活初始化。现在简化多了。

咱们看看各个数据类型简化前后的对比。

4.1、NSNumber 类型
老写法:

[cpp] view plaincopy
NSNumber *number;  
number = [NSNumber numberWithChar:'X'];  
number = [NSNumber numberWithInt:12345];  
number = [NSNumber numberWithUnsignedLong:12345ul];  
number = [NSNumber numberWithLongLong:12345ll];  
number = [NSNumber numberWithFloat:123.45f];  
number = [NSNumber numberWithDouble:123.45];  
number = [NSNumber numberWithBool:YES]; 
 
新写法:
[cpp] view plaincopy
NSNumber *number;  
number = @'X';  
number = @12345;  
number = @12345ul;  
number = @12345ll;  
number = @123.45f;  
number = @123.45;  
number = @YES;  

4.2、NSArray类型
老写法:
[cpp] view plaincopy
NSArray *array;  
array = [NSArray arrayWithObjects:@"object1", @"object2", @"object3", nil];  

新写法:
[cpp] view plaincopy
NSArray *array = @[ @"object1", @"object2", @"object3" ];  

新的写法去掉了后面讨厌的nil。

4.3、NSDictionary类型
老写法
[cpp] view plaincopy
NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"value1", @"value2", @"value3"]  
                                   forKeys:@[@"key1", @"key2", @"key3"]];  
新写法
[cpp] view plaincopy

NSDictionary *dict = @{@"key1": @"value1",@"key2": @"value2",@"key3": @"value3" };  
NSLog(@"%@", dict);  
运行结果正常:
{
    key1 = value1;
    key2 = value2;
    key3 = value3;
}


5、快速通过下标定位对象

他们说新的语法这样是可以的,数组和字典都可以通过下标访问,
[cpp] view plaincopy
NSArray *array =@[ @"object1", @"object2", @"object3" ];  
  
id obj = array[0]; //通过下标方式获取数组对象,替换原有写法:array objectAtIndex:i];  
NSString *obj1  = @"oooo";  
array[0]  = obj1; //也可以直接为数组对象赋值。替换原有写法:[array replaceObjectAtIndex:i 

withObject:newObj];  
  
NSDictionary *dict = @{@"key1": @"value1",@"key2": @"value2",@"key3": @"value3" };  
id obj2 = dict[@"key1"];//获取o2对象,替换原有写法:[dic objectForKey:k2];  
dict[@"key2"] = obj;  //重新为键为k2的对象赋值,替换原有写法:[dic setObject:newObj forKey:k2
  评论这张
 
阅读(859)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017