青出于蓝而胜于蓝
冰凝于水而寒于水
1981年Brad Cox和Tom Love还在ITT公司任职时,接触到了SmallTalk语言,于是Cox写了一个C语言处理器,他们打算使C语言融入一些Smalltalk的优良基因。很快一个可用的C语言扩展诞生了,它就是Objective-C语言的前身。
1988年Steve Jobs离开苹果公司后成立了NeXT公司,NeXT买下了Objective-C语言的授权,并扩展了著名的开源编译器GCC使之支持Objective-C的编译。正是在那时,NeXT用Objective-C编写了后来Apple操作系统的底层库: AppKit和Fundation。
Objective-C又称ObjC或OC语言,是对C语言面向对象的扩充,不同于C++,Objective-C对于C的扩充属于轻量级的,这使得ObjC语言本身要比C++简单的多。
很多人觉得Objective-C的语法十分怪异,这是由于它传承于Smalltalk语言的缘故:
#import
// 类Box的接口定义
@interface Box:NSObject{
int l;
int w;
}
@property int l,w;
-(void)print;
@end
// 类Box的实现
@implementation Box
@synthesize l,w;
-(void)print{
NSLog(@"l=%d,w=%d",l,w);
}
@end
// 创建Box实例对象
Box *box = [[Box alloc] init];
// 调用Box实例方法
[box print];
虽然从某些方面来看,Objective-C很像C语言,但骨子里ObjC却是一个完全的动态语言,其内部对方法的调用全部采用发送消息的机制,这使得ObjC灵活度非常高。
GCC与Clang都含有Objective-C编译器,Objective-C可以在GCC以及Clang运作的系统上编译。除此之外,Objective-C还包含一个非常简单的垃圾回收机制:ARC。
Objective-C的流行归功于iPhone的成功,或者反过来说也没有错。因为在当时,编写iPhone应用程序的主要编程语言是Objective-C。
其实Objective-C也是一门非常优秀的语言,不过它毕竟“年纪”有点大,无论是语言简洁性或是对新特性的支持上来说,都有点落伍。比如说它“蹩脚”的语法、Runtime的各种黑魔法以及不支持命名空间等诸多瑕疵。
Objective-C从诞生到现在几十年一共才迭代2个版本,而Swift短短几年就已经5个大版本了,小版本更是不计其数。
Swift语言之父、LLVM之父以及clang主要开发者Chris Lattner曾被问及这样一个问题:
为什么要开发Swift语言,而不是把精力花在优化Objective-C上?
他这样回答:原因有三个
做一件事情最好是十年前,其次是现在;如果说十年前做Apple开发当仁不让的选择是Objective-C的话,那么现在Swift语言就是一个非常明智的选择了。
简单来说,Swift有如下优势:
正如你所能预计到在一门基于 C 构建的语言上,Objective-C 所有的弊端都有。
而Swift 丢弃了遗留下来的约定,因而你不再需要行尾的分号,以及 if/else 语句中围绕条件表达式的括弧。Swift中方法调用不再出现互相嵌套中括号的深坑 (再见吧,[[[ ]]]),调用更像是自然的英语 – 一点也不像 Objective-C 这只大笨象。
一个非常明显的结果是,对于相同功能的代码,Swift需要的代码行数远远少于ObjC。代码越少,出错可能性自然越低。
不像ObjC,Swift是一门类型安全的语言,这意味着Swift会杜绝代码中类型不一致的情况出现。
因为ObjC相对更加底层,所以对诸如指针之类对象的使用更需小心翼翼。而Swift从语言层面帮你避免在托管情况下访问底层内容(当然非托管下也是可以的),极大的防止了“低级错误”的发生。
而对于ObjC中棘手nil值的处理,Swift提出了可选值的概念,完美避开风险,进一步增加了语言的安全性。
Swift 以一种 Objective-C 前所未有的方式对内存管理进行了统一,对自动引用计数 (ARC) 的支持是在整个过程化和面向对象的代码路径上完成的。
在ObjC中在使用 Core Graphics API 以及其它 iOS 上的底层 API 时,内存管控的处理都是程序员的责任,而在Swift中会将其调用进行安全封装,程序员在 Objective-C 上会遇到的大量内存溢出问题在 Swift 上是不可能的。
删除遗留下来的C语言约定大大提升了引擎之下Swift的性能. 苹果公司一直都在致力于Swift代码运行速度的提升。
苹果公司从一开始就力图将Swift打造成一门极具效率、迅捷的语言,ObjC 和 Swift 语言在 Richards 上评测的结果显示,Swift 比 OC 快了4倍,Swift同OC相比会更快。
Objective-C 代码中一直令人很困扰的问题就是缺乏对命名空间的正式支持, 它是 C++ 处理文件名冲突的解决方案。当名称冲突发生在 Objective-C 中时,就会是一个链接器错误,会导致 app 无法运行。
而Swift提供了隐含的命名空间,允许相同的代码文件存在于多个项目,而不会造成构建失败,或者需要像 NSString (源自NextStep系统) 或者 CGPoint (Core Graphics)这样的怪异名称。
Swift 中的这一特性使得开发者更加具有生产力,在简单如 Array,Dictionary 以及 String 这样的名字中你可以看到 Swift 的简洁魅力所在,而不是脱胎于缺少命名空间的 Objective-C 中的 NSArray、NSDictionary 以及 NSString这样冗余的名字。
作为快速编写原型或测试来说,没有比Swift中的Playground更给力的了,这在Objective-C中几乎是束手无策的事。
类似于Ruby中的irb环境,Playground就像一个设备齐全的实验室,任你在其中做任何快速和安全的实验,无论是代码原型、性能、数据库或是界面布局的测试都没问题,而且这在iPad中也可以使用。
从Apple公司的行动和出牌中可以看出,Swift是其力捧的一门语言,虽然说ObjC在未来一段时间里都还将存在,但Swift无疑会成为开发中更优秀的核心力量。
现在无论是从语言规范上还是社区的建设来看,Swift越来越显得成熟和稳健,相信今后在苹果平台乃至其他第三方平台(Swift支持Linux,最新已开始支持Windows平台)的开发中,Swift语言将会是当仁不让的超级巨星。
Swift语言能够一步步成为当今Apple开发中的绝对主角,绝非一朝一夕之功,接下来就让我们了解一下Swift的成长历程吧。