OC中的语法糖(你真的理解了点语法么?)

来源:互联网 发布:软件交付风险 编辑:程序博客网 时间:2024/06/01 08:08

         我们学过OC以后(C语言一样有),很多东西是通过点语法来调用的,有人会告诉你,点语法写在左边是setter、写在右边是getter...那么,数组的"array.count"是什么?很显然不是,因为本身count就不是一个属性,而是一个方法。那好了,我们到底怎么理解?先抛下一个疑问,我们来看看语法糖的解释,首先我们给出维基百科的解释,虽然很多废话,但是我还是建议大家看一下:语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

       那我们简单阅读一下就知道其实就是“实际上没有对代码功能没有影响,但是增强我们程序的可读性”的语法。

       比如一开始抛出的问题,点语法是什么?它就是语法糖,当编译器执行到array.count的时候,系统会自动的指派编译器去执行一个方法:     

   - (NSUInteger)count;

      那么这个时候我们就理解了,类似的还有取数组的元素等等,其实就是我们通过语法糖跳过了本来应该执行程序的步骤,但是编译器在找到语法糖的时候却会老老实实的找到我们代码没有展示的部分来执行。这么做的目的只有一个,就是增加可读性,减少代码出错。这个时候我们就意识到很多东西都是我们用语法糖做的了,比如字面量,比如数组本身。还有我们遇到过的在学习属性时的@synthesize,点语法只是它的凤毛麟角。这时候我想大家有一定的了解了。下面我们就来举例一些常用的语法糖:

       1、枚举类型,当我们选择执行对应的一个参数的的时候,它会自动找到它所在的枚举位置和代表的数值执行:       

   enum {      NSSortConcurrent = (1UL << 0),      NSSortStable = (1UL << 4),   };   typedef NSUInteger NSSortOptions;

       2、所有的字面量,包括数组、字典,字符串等对象的直接赋值等等,都是我们在调用语法糖:

   NSNumber *value;value = @12345;
   NSMutableArray *mutablePlanets = [@[                                        @"Mercury", @"Venus", @"Earth",                                        @"Mars", @"Jupiter", @"Saturn",                                        @"Uranus", @"Neptune"                                          ] mutableCopy];

      3、点语法。没错,OC里面所有的点语法都是,数组取值、元素赋值......

      4、属性的@synthesize,我们知道现在连@synthesize也可以省略了,那就是说@property本身已经连带使用了语法糖。

      5、当然,OC是C的超集,C语言也有很多,就不一一介绍了,C语言中对于数组的操作“a[i] 表示*(a+i)”也是。

        6、最后提一下,实际上从面向过程到面向对象也是一种语法糖,Objective-C是属于早期语言中比较靠后诞生的,所以语法糖最早是在其它语言中得以体现。C语言可以通过它的指针、类型转换,结构实现面向对象的编程风格,但是C++更进一步的推广了这种风格,更加易用,不过到了C#把OO的风格发挥得淋漓尽致。OO的编程风格对于面向过程来说是不是一种语法糖呢?如果生硬地照此理解,只有计算机硬件指令才不算语法糖,而其他一切利用编译器、汇编器将代码抽象,和自然语言更相近的手段都算语法糖。最后的最后,想和大家说一下,不要生搬,我们学习知识是为了生活、生产更方便,而不是纠结于知识的本身。其实除了语法糖,还有语法盐,基本上是和语法糖对着来的,和语法糖相反,有意使书写代码更加困难以避免人为疏失产生错误的语法。


总而言之,它可以给我们带来方便,是一种便捷的写法,编译器会帮我们做转换;而且可以提高开发编码的效率,在性能上也不会带来损失。但是缺点就是人为疏失产生错误的语法可能性加大,仁者见仁智者见智,一个东西只有经历了更多人得使用才会证明它的价值。若有其它见解或者补充,欢迎道友一起探讨。

       

0 0