Swift (程式語言)

历史

2010年7月，苹果开发者工具部门总监克里斯·拉特纳开始着手Swift 编程语言的设计工作，以一年时间，完成基本架构后，他领导了一个设计团队大力参与其中。Swift大约历经4年的开发期，2014年6月发表。
苹果宣称Swift的特点是：快速、现代、安全、互动，而且明显优于Objective-C语言。Swift以LLVM编译，可以使用现有的Cocoa和Cocoa Touch框架。Xcode Playgrounds功能是Swift为苹果开发工具带来的最大创新，该功能提供强大的互动效果，能让Swift源代码在撰写过程中能即时显示出其运行结果。拉特纳本人强调，Playgrounds很大程度是受到布雷特·维克多理念的启发。
2015年6月8日，苹果于WWDC2015上宣布，Swift将开放源代码，包括编译器和标准库。
2015年12月3日，苹果宣布开源Swift，并支持Linux，苹果在新网站swift.org和托管网站Github上开源了Swift，但苹果的app store并不支持开源的Swift，只支持苹果官方的Swift版本，官方版本会在新网站swift.org上定期与开源版本同步。

特色

Swift取消了Objective-C的指针和其他不安全访问的使用，舍弃了Objective C早期套用Smalltalk风格的语法，全面改为句点表示法（dot-notation）。Swift具备类型推导（type inference）。同时，它提供了类似C++、C#中的名字空间（namespace）、泛型（generic）、运算符重载（operator overloading）。Swift被简单的形容为“没有C的Objective-C”（Objective-C without the C）。

类型和变量

在Cocoa与Cocoa Touch的环境下，许多共享的类都放在Foundation Kit库下，这些类别包含了NSString 字符串库（使用 Unicode），还有集合类别NSArray 与 NSDictionary。Objective-C 提供了语法糖的方式让这些对象可以集成在同一个语言里。例如NSString之间合并的表示法如下：
NSString *str = @"hello,";str = [str stringByAppendingString:@" world"];
 在Swift里, 字符串的累积可以用加法（+）操作数作为第一类对象（First-class citizen）的方式直接完成, 上述的例子可以简化为
var str="hello"str += "world"
过去Cocoa（以及Cocoa Touch）的架构总是被分成两种版本，一种是可变的（mutable），也就是可以在运行时期（runtime）改变；另一种是不可变的（immutable），其初始值不可改变，例如NSArray与NSMutableArray就是数组的两种版本。Swift语言延续这个传统，但简化为使用let 关键字去设置常量（constant variable）。可变的(Mutable)对象使用var 关键字，不可变的对象则适用let关键字。Swift语言使用类似C#或Javascript的var定义变量，但特性又不尽相同。Swift不直接指派初始值给变量，变量无默认值，因此使用var变量之前必须先初始化，不然将发生编译时期的错误。
为了方便使用，Swift提供Optional类型来宣告nil-free references。宣告Optional只需要在类型后面加上问号（?）即可。一旦var变量宣告为Optional的，其初始值就会被默认为nil。Optional本质上是enum，定义了None和Some两种类型，nil即是Optional.None。

函数库、执行时期与部署

Swift在 Mac OS 和 iOS 平台可以和Objective-C 使用相同的运行时期（runtime），因此Swift 程序能运行在当前已存在的平台上，包括 iOS 6 和 OS X 10.8或更高的版本。 更重要的, Swift 和 Objective-C 的代码可并存于同一程序代码, 这种延伸就如同C 和 C++ 的关系一样。
为了吸引开发人员和复用已存在的代码，Xcode 6允许在app target 导入 Objective-C 头文件供给Swift 使用，通过 Objective-C 的桥接头文件（bridging header）来供给Swift。当开发人员添加Swift 文件到现有的Objective-C应用程序时，Xcode自动创建相应的头文件。例如，一个 Swift 类 "MyClass" 可用于Objective-C 的方式为
#import "MyClass-Swift.h".

内存管理

Swift全面使用自动引用计数（ARC）来管理内存，取代Objective C的垃圾回收功能。在Objective-C中，强引用（strong reference）即为非ARC中的retain，而弱引用（weak reference）即为非ARC中的assign。为了解决循环引用的问题，Swift提供unowned，不能设定为optional types，不能加上问号（?）或惊叹号（!）。

调试以及其他元素

Xcode的调试机制针对Swift语言提供REPL（Read-Eval-Print Loop, 这是源自emacs的术语）环境，可以利用Swift语法来评估或于其他程序互动，使Swift编程具有类似Python或Ruby带有的交互性界面（Interactive Shell）。

讨论

长达600多页的The Swift Programming Language 可以在iBooks免费下载。

范例代码

Swift不需要引入头文件（header file）或main()函数，不需要在每一行语句（statement）结尾加上分号。
变量声明方式如下：
var implicitInteger = 70var implicitDouble = 70.0var explicitDouble: Double = 70
用 let 宣告常量方式如下：
let numberOfApples = 3let numberOfOranges = 5let appleSummary = "I have \(numberOfApples) apples."let fruitSummary = "I have \(numberOfApples + numberOfOranges) pieces of fruit."
Swift不支持隐式类型转换（implicitly casting），因此数值和字符串之间必须显式类型转换（Explicitly casting）：
let table = "The width of this table is "let width = 100let tableWidth = table + String(width)
以下是Hello World程序：
println("Hello, world")print("Hello, world") /*Swift 2.0 之後不再使用println，改使用print*/
使用Unicode字符，例如在文本中放心添加有不同语言的文字:
let 人 =["新": 67, "青": 8, "玉": 33, "小小": 25]for (名字, 歲) in 人 {
  println("\(名字)是\(歲) 歲。")}