近期在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这个词easy让人误解,可能就叫接口(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的文件)中,而@implementation部分放在源文件(后缀名为.m的文件)中。一个定义接口。一个定义实现,做到接口跟实现分离,将来能够通过置换调实现文件来提供新的或者不同的功能。为此,你应该直接使用Xcode来建一个项目,例如以下图所看到的: