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("\(名字)是\(歲) 歲。")}