最近在Mac和iOS上做开发,觉得应该写一点东西分享给感兴趣的童鞋们。在此之前,曾经有很多同行们都在埋怨苹果Objective-C的复杂和难以上手,为此也有很多人对今年(2014年)刚推出的Swift抱有很多幻想。首先在现阶段甚至五年以内,我个人感觉Mac和iOS的开发可以说仍然离不开Objective-C,即便是应用级(非系统级)的开发,招聘iOS程序员肯定还是看有没有扎实的Objective-C的功底,虽然苹果希望Swift能够取代Objective-C,但这一定是一个长期目标。在Swift的发布会上,库克说Swift会成为改变一切的语言,仅仅两个月之后,在TIOBE发布的编程语言排行榜上,Java和C++再创历史新低(当然我最钟爱的C语言仍然占据头把交椅,虽然它的Rating也下降了0.25%),而Swift作为一个新生儿直接抢占了第18名的宝座(大约100个程序员里面就有一个使用Swift的),人们对这个语言的期待可以说是异常的高。然而,我想说的是,Objective-C没有想象中的那么难,而Swift也不是轻松愉快就能玩转的,Swift同时接纳了两种编程理念或者叫范式(paradigm),面向对象编程和函数式编程,而在此之前,关于面向对象编程和函数式编程究竟孰优孰劣的争论很长时间都没有停止过。其实,真正理解两种编程范式的程序员不会武断的说这二者孰优孰劣,因为任何编程语言都没有什么灵丹妙药让其使用者成为优秀的程序员。又如牛人王垠说的,『无论任何事情,当走向极端时都是有害的。极端化时,面向对象编程和函数式编程都试图将整个世界装入其特有的模型中,但是这个世界是不依赖于我们的大脑的思考的情况下运转的。如果以为你有一个锤子,就把所有东西都当成钉子,这显然是不对的。只有通过认清我们的真实世界,才能摆脱信仰对我们的束缚。』『让你的模型适应世界,而不是让世界适应你的模型。』虽然我不喜欢王垠这个人,但是这段话我还是很赞同的。林锐博士也说过,『一个优秀的程序员不会宣称自己效忠于某种语言』,他们总是选择最合适的工具做自己想做的事。其实,即便你是一个Java程序员,如果你使用过访问者模式、命令模式,如果你使用过接口回调,你实际上已经使用了函数式编程的理念,同样,你也可以用C语言写出面向对象风格的代码。
Swift可以说是比JavaScript还大杂烩的大杂烩,从它身上你似乎不怎么能看到Objective-C的影子,但是却有JavaScript、C#、Java和其他一些我不了解的动态语言/函数式语言(如Ruby、Python、Haskell)的身影,只是这一点就注定了它『绝不简单』。其实苹果早在2010年就任命Chris Lattern为iOS开发下一代编程语言,经过4年的时间才打造出了Swift。简单的说,Swift是支持面向对象和函数式两种编程范式的语言,它在动态语言和静态语言之间寻找平衡点,既有静态语言的特征,也具体动态语言的神韵,同时它也是类型安全语言,又支持很多高级语言特性,包括闭包、泛型等。Swift能给非常方便的和C/C++/Objective-C进行混合编程,使用Unicode字符集。和Swift一起推出的是Xcode中的Playground,这个东西虽然让某些程序员觉得惊艳,但是其实IBM早在十年前就有类似的东西,只不过没有Playground那么炫罢了。最近看了苹果iPhone6的发布会,突然觉得对苹果的未来持悲观态度了,没有了乔帮主,苹果还能牛多久呢,谁也不知道。反正,作为一个程序员或者开发者,不管你选择使用Objective-C还是Swift,都会有很长的路要走,要经过各种修炼,其实Objective-C那种声明和实现分离的做法不就是在践行面向对象原则中的接口和实现分离,面向接口编程的理念吗,所以在我心中那是很优雅的。Swift中的protocol(协议)不也是如此吗,只不过protocol这个词容易让人误解,可能就叫接口(interface)或者契约会更好吧。下面给出一些链接帮助有兴趣的童鞋们阅读相关资料,同时附上一段用Objective-C写的代码,做的是一个计算机自己跟自己玩猜数字的小游戏。
面向对象编程语言中的函数式编程:http://blog.csdn.net/shendl/article/details/2064218
王垠:面向对象和函数式编程的问题出在哪里?http://geek.csdn.net/news/detail/3603
TIOBE 2014年9月编程语言排行榜:http://www.csdn.net/article/2014-09-09/2821587-tiobe-programming
下图展示了Xcode 6的新功能Playground:
用Objective-C写的猜数字游戏(计算机自己出一个1-100的随机数,然后自己来猜答案)
#import <Foundation/Foundation.h> @interface Game : NSObject { @private int correctAnswer; NSString *hint; } - (Game *) init; - (int) judge:(int)thyAnswer; - (NSString *) getHint; @end @implementation Game - (Game *) init { self = [super init]; correctAnswer = arc4random() % 100; return self; } - (int) judge:(int)thyAnswer { if(thyAnswer == correctAnswer) { hint = @"恭喜你,答对了!"; } else { if(thyAnswer < correctAnswer) { hint = @"大一点"; return 1; } else { hint = @"小一点"; return -1; } } return 0; } - (NSString *) getHint { return hint; } @end int main() { Game *g = [Game new]; int lower = 0, upper = 100; int result = 0; do { int myAnswer = (lower + upper) / 2; NSLog(@"I guess the answer is: %d", myAnswer); result = [g judge:myAnswer]; NSLog(@"%@", [g getHint]); switch(result) { case -1: upper = myAnswer; break; case 1: lower = myAnswer; break; } } while(result != 0); NSLog(@"游戏结束!"); [g release]; return 0; }
由于Mac系统是基于Unix的操作系统,因此打开终端程序可以通过键入命令的方式来编译和运行上面的代码,命令如下:
cc -framework Foundation 文件名.m (cc就是c-compiler,Unix系统的C编译器,也能够编译Objective-C并生成目标代码)
当然,上面的代码并不应当放在同一个文件中,@interface部分放在头文件(后缀名为.h的文件)中,[email protected](后缀名为.m的文件)中,一个定义接口,一个定义实现,做到接口跟实现分离,将来可以通过置换调实现文件来提供新的或者不同的功能。为此,你应该直接使用Xcode来建一个项目,如下图所示:
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/app/5333.html