苹果的新玩具:Swift(雨燕)- 流行编程语言的大拼盘
Swift是本届WWDC大会苹果推出的一门新开发语言,开发者网站上已经放出了这门新语言的介绍、教程和手册,如果手里有一台iOS设备的话,通过苹果的iBooks应用,从它的官方书店里搜索Swift,可以下载它的官方手册电子书版。
为什么苹果要推出一门新的语言?个人浅见,现在苹果平台的主力开发语言,Objective-C已经无法再进化,无法再发展了,已经无法再赶上现代编程语言前进的步伐!了解Objective-C历史及原理的人都知道,Objective-C是门抄捷径的语言,它基本上没有发明新语法,仅仅是将Smalltalk的消息接口机制套在了C语法上,这虽然让它既拥有C语言的高效率和操纵系统一切的能力,也拥有了像Perl、Ruby等动态语言的动态特性,但是它的发展已经受限于古老的C语法,及C/C++令人恶心到吐的内存出错,想要在开发效率和丰富的表达能力上追赶C#、Go等语言已经是不可能完成的任务,因此干脆推出一门从头重新设计的语言,已经不是折腾不折腾的问题,而是必须的事情了。
虽然说Swift是门新语言,但是并非什么重新发明的语言,而是各种先进语言的大杂烩!例如很多网友第一眼看到它用func关键字定义函数就说这不是Go语言吗?当然了它不是Go的简单克隆品,像前面所说,是掺入了各种目前流行语言的特色(我个人认为Scala影响的最多)。下面我举几个简单的例子,列举我认为的语言出处,希望能大概的看到它的设计哲学和语言特色。事先声明一下,个人知识所限,有些出处可能说的不准确,还请见谅指正,感谢。
1.声明变量
Swift是门强类型语言,引入了其它强类型语言的类型推导机制。
声明一个变量
var i = 100
声明一个常量
let i = 100
变量与常量使用不同的关键字,这个应该是模仿Scala的var和val,let关键字则应该是来自Mozilla的rust语言,不过含义正好相反。
2.类型声明后置
var name:String = "Swift"
这种写法的出处应该是Pascal,很多流行的强类型动态语言现在都使用这种方式声明类型,例如Scala。
3.所有的函数现在都是闭包了
func getGasPrices() -> (Double, Double, Double) { return (3.59, 3.69, 3.79) }
这么写很像是Scala的写法,意思差不多。
4.类定义终于使用class了
我只想说,呵呵。
5.定义属性使用set/get
var sideLength : double var perimeter: Double { get { return 3.0 * sideLength } set { sideLength = newValue / 3.0 } }
这个应该是C#最早发明的语法。
6.重载父类方法需要加override关键字
override func simpleDescription() -> String { return "A square with sides of length \(sideLength)." }
应该是来自Java的@Override注解。
7.enum是一种类定义
你可以在enum里加入方法,我记得这是Java的,C++11也引入了相似的概念和写法。
8.引入了(或者说保留?)struct,它和class不同的地方在于,变量赋值时,struct变量是内容复制,class是引用复制,这个毫无疑问,C#的东西。
9.范式,可以创建方法模板
func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] { var result = ItemType[]() for i in 0..times { result += item } return result } repeat("knock", 4)
C++玩了很多年的东西了。
当然,Swift还有很多的东西,这里仅是蜻蜓点水随便列举了几个,总的来说,函数式编程,语言动态化,这些编程语言进化的大趋势,都在Swift里贯彻了,Swift也将苹果平台开发人员从头疼的内存错误等底层错误中解放出来,更着眼于业务逻辑的实现。
但是,从Objective-C转到Swfit,成本还是非常高的。相信,动态函数式语言的爱好者,那些习惯于使用Ruby,Scala等语言开发系统的人,更会喜欢这门新语言;目前的开发人员,特别是精通C/C++的人,则要花费更大的精力转换思维,毕竟,思维惯性,不是说转就转的。
最后吐槽一下,个人认为通过..和...表达数值空间是非常非常糟糕的,看下下面的例子你就知道了,
for var i in 0..3 //相当于for (int i=0; i<3; i++) 和 for var i in 0...3 //相当于for (int i=0; i<=3; i++)
真正做到了,手抖一下郁闷一下午的功能!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。