首页 > 代码库 > 苹果的新玩具:Swift(雨燕)- 流行编程语言的大拼盘

苹果的新玩具: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++)

真正做到了,手抖一下郁闷一下午的功能!