Swift_(程式語言)

**Swift 程式語言，**支援多編程範式和編譯式，用來撰寫基於 macOS/OS X、iOS、iPadOS、watchOS 和 tvOS 的軟體。
蘋果公司於 2014 年在蘋果開發者年會（WWDC）發布了 Swift 程式語言。從設計上蘋果公司讓 Swift 與 Objective-C 共存在蘋果公司的作業系統上。

## 歷史

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 之間合併的表示法如下：

 在 Swift 裡，字串的累積可以用加法（`+`）運算元作為頭等物件（First-class citizen）的方式直接完成，上述的例子可以簡化為 

過去 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）。

### 類似 Objective-C 之處

* 基本數值型別（numeric types）大致相同 (例如 `Int, UInt, Float, Double`)
* 大量的 C 語言運算子被移出 Swift, 與此同時引入了新運算子。
* 大括號被用於群組陳述（group statements）。
* 變數之賦值使用等於符號，但比較則使用「連續兩個等於」（==）運算元。還有一個新的運算元，「連續三個等於」（===）被用來判斷常數或變數之間是否為同一物件之實例（instance）。
* 中括號（[], Square brackets）用於陣列的表示，宣告陣列之後，可以指派索引值（index）來進行元素（element）之存取。
* 控制陳述（control statement）, `for, while, if, switch` 與 Objective-C 都十分類似，但有延伸功能，像是 `for in` 用於集合（collection）的輪詢，`switch` 還可以接受非整數的 cases 條件值，諸如此類。

### 不同於 Objective-C 之處

* 陳述句（statement）不需要用分號（`;`）結束，但分號可以作為一行上兩個以上語句的分割符。
* 不需要標頭檔（Header files）。
* 註解方式 /\* ... \*/ 巢狀，指注釋里可以再有注釋。
* 強類型
* 類型推論或隱含類型（Type inference）
* 支援泛型編程。
* 函式成為第一等類型（first-class object），這意味著函式可以作為其他函式的參數和返回值。
* 運算子多載。運算子可在類內重新定義。
* 定義新的運算子。
* 字串全方面支援 Unicode。
* 規避了 C 語言家族的易錯行為：
  * 不存在指標。
  * 賦值語句沒有返回值。若將 `if (i==0)` 誤寫成 `if (i=0)`，將造成編譯時期錯誤。
  * 在 `switch` 的區塊內不需要使用 `break` 語句。另外，case 後面都需要有可執行的代碼（C 或 C++ 可連續使用多個 case 而不需要額外的代碼），否則將觸發編譯錯誤。
  * 變數和常數必須初始化才能使用，而且陣列（array）的邊界必須明確確認。
  * 溢位（overflows）的問題。C 語言沒有強制整數型別（signed integers）的界限，常常在觸發執行時期錯誤。Swift 通過整數類型的 max 或 min 屬性取得最大值或最小值。

## 討論

長達 600 多頁的 _The Swift Programming Language_ 可以在 iBooks 免費下載。

## 範例代碼

Swift 不需要引入標頭檔（header file）或 `main()` 函式，不需要在每一行語句（statement）結尾加上分號。

變數聲明方式如下：

用 let 宣告常數方式如下：

Swift 不支援隱式類型轉換（implicitly casting），因此數值和字串之間必須顯式類型轉換（Explicitly casting）：

以下是 Hello World 程式：

使用 Unicode 字元，例如在文字中放心添加有不同語言的文字:

## 相關條目

* Objective-C
* C 語言

## 參考資料

## 外部連結

* 官方網站
* 蘋果開發者上的 Swift（頁面存檔備份，存於網際網路檔案館）
* iOS Example（頁面存檔備份，存於網際網路檔案館）
* GitHub 上的 Swift 原始碼