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

注意,下面的语法需要下载Xcode 4.4。

1、枚举类型的改变

老写法:

[cpp] view plaincopy
  1. typedef enum Week{
  2. Moday,
  3. Tuesday,
  4. Wednesday,
  5. Thursday,
  6. Friday,
  7. Saturday,
  8. Sunday
  9. }Week;

老方法的问题是枚举值的数据范围是模糊的,这个数值可能非常大,可能是负数,无法界定

新写法:

[cpp] view plaincopy
  1. typedef enum Week:NSUInteger{
  2. Moday,
  3. Tuesday,
  4. Wednesday,
  5. Thursday,
  6. Friday,
  7. Saturday,
  8. Sunday
  9. }Week;

新方法在列出枚举内容的同时绑定了枚举数据类型NSUInteger,这样带来的好处是增强的类型检查和更好的代码可读性。

2、使用的方法代码放置的位置顺序无关

没在.h文件中声明的方法,在时候的时候如果方法不在前面,可能会有警告。

比如:

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

实现:

[cpp] view plaincopy
  1. @implementation MyClass
  2. -(void)doSomething:(NSString *)print{
  3. NSLog(@"%@", [print stringByAppendingFormat:[self getString]]);
  4. }
  5. -(NSString *)getString{
  6. return@"string for something";
  7. }
  8. @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
  1. NSNumber *number;
  2. number = [NSNumber numberWithChar:'X'];
  3. number = [NSNumber numberWithInt:12345];
  4. number = [NSNumber numberWithUnsignedLong:12345ul];
  5. number = [NSNumber numberWithLongLong:12345ll];
  6. number = [NSNumber numberWithFloat:123.45f];
  7. number = [NSNumber numberWithDouble:123.45];
  8. number = [NSNumber numberWithBool:YES];

新写法:

[cpp] view plaincopy
  1. NSNumber *number;
  2. number = @'X';
  3. number = @12345;
  4. number = @12345ul;
  5. number = @12345ll;
  6. number = @123.45f;
  7. number = @123.45;
  8. number = @YES;

4.2、NSArray类型

老写法:

[cpp] view plaincopy
  1. NSArray *array;
  2. array = [NSArray arrayWithObjects:@"object1", @"object2", @"object3", nil];

新写法:

[cpp] view plaincopy
  1. NSArray *array = @[ @"object1", @"object2", @"object3" ];

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

4.3、NSDictionary类型

老写法

[cpp] view plaincopy
  1. NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"value1", @"value2", @"value3"]
  2. forKeys:@[@"key1", @"key2", @"key3"]];

新写法

[cpp] view plaincopy
  1. NSDictionary *dict = @{@"key1": @"value1",@"key2": @"value2",@"key3": @"value3" };
  2. NSLog(@"%@", dict);

运行结果正常:

{

    key1 = value1;

    key2 = value2;

    key3 = value3;

}

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

他们说新的语法这样是可以的,数组和字典都可以通过下标访问,

[cpp] view plaincopy
  1. NSArray *array =@[ @"object1", @"object2", @"object3" ];
  2. id obj = array[0]; //通过下标方式获取数组对象,替换原有写法:array objectAtIndex:i];
  3. NSString *obj1  = @"oooo";
  4. array[0]  = obj1; //也可以直接为数组对象赋值。替换原有写法:[array replaceObjectAtIndex:i withObject:newObj];
  5. NSDictionary *dict = @{@"key1": @"value1",@"key2": @"value2",@"key3": @"value3" };
  6. id obj2 = dict[@"key1"];//获取o2对象,替换原有写法:[dic objectForKey:k2];
  7. dict[@"key2"] = obj;  //重新为键为k2的对象赋值,替换原有写法:[dic setObject:newObj forKey:k2]

可是事实是这样的:


现实总是残忍的。于是google 了一下,发现这个语法是针对iOS 6 or OS X 10.8 SDKs的,我没有ios 6模拟器而已没有10.8 SDKs。所以报错了。可以参考这里:http://stackoverflow.com/questions/11425976/compiler-error-expected-method-not-found-when-using-subscript-on-nsarray

下面是WWDC 2012视频的一些关于新语法特性的截图:

截图可以给你解释,新的语法特性编译器是怎么实现的。

转载于:https://www.cnblogs.com/easonoutlook/archive/2013/05/30/3108091.html

Xcode 4.4 的新特性 | LLVM 4.0 的新语法相关推荐

  1. [转]C# 2.0新特性与C# 3.5新特性

    C# 2.0新特性与C# 3.5新特性 一.C# 2.0 新特性: 1.泛型List<MyObject> obj_list=new List(); obj_list.Add(new MyO ...

  2. SQL Server 2016新特性:列存储索引新特性

    SQL Server 2016新特性:列存储索引新特性 行存储表可以有一个可更新的列存储索引,之前非聚集的列存储索引是只读的. 非聚集的列存储索引支持筛选条件. 在内存优化表中可以有一个列存储索引,可 ...

  3. Atitit.  c# 语法新特性 c#2.0 3.0 4.0 4.5 5.0 6.0   attilax总结

    Atitit.  c# 语法新特性 c#2.0 3.0 4.0 4.5 5.0 6.0   attilax总结 1.1. C# 1.0-纯粹的面向对象 1.2. C# 2.0-泛型编程新概念 1.3. ...

  4. Kinect SDK v1.7 新特性、交互框架与新概念

    Kinect SDK v1.7 新特性.交互框架与新概念 zouxy09@qq.com http://blog.csdn.net/zouxy09 2013年3月18日,微软Kinect for Win ...

  5. Oracle 21C 新特性:数据泵相关新特性汇总

    墨墨导读:本文来自墨天轮用户"JiekeXu"投稿,墨天轮主页:https://www.modb.pro/u/434,本文分享Oracle 21c 新特性:数据泵相关新特性汇总. ...

  6. 重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性...

    原文:重新想象 Windows 8.1 Store Apps (91) - 后台任务的新特性: 下载和上传的新特性, 程序启动前预下载网络资源, 后台任务的其它新特性 [源码下载] 重新想象 Wind ...

  7. 【小家java】java9新特性(简述十大新特性) 褒贬不一

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  8. 【小家java】java10新特性(简述十大新特性) 小步迭代

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  9. Java11新特性(一)——JDK11新特性概述

    序言 关于JDK11,自从去年也就是2018年9月份 Oracle 对外公布--JDK11正式发布以来,博主就跃跃欲试,但是由于项目周期时间紧,一直未果,今年,也就是2019年2月底系统正式上线,博主 ...

最新文章

  1. 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大
  2. suse linux通过iso文件安装gcc
  3. matlab需要多大运存_提高matlab运行效率
  4. Setting composer minimum stability for your application
  5. 前端开发中使用mock模拟数据
  6. fcpx怎么合成延时摄影_延时摄影合成终极后期教程
  7. 微信小程序 点击按钮 退出
  8. kubernetes mysql pxc_K8S使用operator部署和管理Percona - PXC集群
  9. 基于友善之臂ARM-ContexA9-ADC驱动开发
  10. YOLOv5 的妙用:学习手语,帮助听力障碍群体
  11. Hadoop Hive基础sql语法
  12. 39.Linux清除用户登录记录和命令历史方法
  13. Android MediaPlayer+Stagefright框架(音频)图解
  14. SecureCRT http代理设置
  15. html如何添加字体
  16. flea-jersey使用之Flea RESTful接口服务端接入
  17. 计算机电路图解,简单逆变器电路图和工作原理图解大全
  18. TCP延迟确认机制和SACK
  19. 清浅时光,岁月静好——我的2016
  20. 8 个测试人员不背锅小建议

热门文章

  1. 【Linux系统编程】线程堆栈大小的使用介绍
  2. [Qt教程] 第48篇 进阶(八) 3D绘图简介
  3. C++编程问题汇总(方便日后查阅)
  4. 51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))
  5. Redis源码剖析(七)监视功能
  6. wordpress Oops! That page can’t be found.
  7. 命令行运行vbs脚本并传参数给vbs中的变量简单示例
  8. linux下使用rdesktop连接远程windows
  9. pytorch 之 有关交叉熵函数使用的几点说明
  10. undefined reference to `sqrt‘ 问题