Swift語言

Swift編程語言，支持多編程範式和編譯式，用來撰寫基於macOS、iOS、iPadOS、watchOS、tvOS和visionOS的軟體。

蘋果公司於2014年在蘋果開發者年會（WWDC）發布了Swift程式語言。從設計上蘋果公司讓Swift與Objective-C共存在蘋果公司的作業系統上。

## 歷史

Swift是為了替代蘋果公司早期的Objective-C程式語言，該語言自20世紀80年代初以來基本沒有任何更新，缺乏現代語言功能。

2010年7月，蘋果開發者工具部門總監克里斯·拉特納開始著手 Swift 程式語言的設計工作，以一年時間，完成基本架構後，他領導了一個設計團隊參與其中，與蘋果的許多程式設計師共同開發，借鑑了Objective-C、Rust、Haskell、Ruby、Python、C#、CLU等許多其他語言的設計思想。2014年6月2日，蘋果在WWDC上發布了第一個公開的使用Swift編寫的應用程式：WWDC應用程式，同時向蘋果的註冊開發者發布了Swift語言的測試版，但未承諾最終版本與測試版本的原始碼相互兼容。大會也發布了長達500頁的官方指南，The Swift Programming Language，在Apple Books和官方網站上免費提供。蘋果計劃在完整版發布時，如果有必要，將會提供原始碼轉換器。

蘋果宣稱Swift的特點是：快速、現代、安全、互動，而且明顯優於Objective-C語言。Swift以LLVM編譯，可以使用現有的Cocoa和Cocoa Touch框架。Xcode Playgrounds功能是Swift為蘋果開發工具帶來的最大創新，該功能提供強大的互動效果，能讓Swift源代碼在REPL撰寫過程中能即時顯示出其執行結果。拉特納本人強調，Playgrounds很大程度是受到布雷特·維克多理念的啟發。

2014年9月9日，Swift 1.0和iOS 8、Xcode 6.0的Golden Master版本一同發布，達成了一個重要的里程碑。

2015年6月8日，蘋果於WWDC2015上發布了Swift 2.0。同時宣布，未來Swift將開放原始碼，包括編譯器和標準庫。2015年9月21日起，可在App Store發布以Swift編寫的應用。

Swift在2015年Stack Overflow開發者調查中榮獲「最受歡迎的程式語言」第一名，並在2016年榮獲第二名。

2015年12月3日，蘋果宣布開源Swift，並支持Linux，蘋果在新網站swift.org和託管網站Github上開源了Swift，但蘋果的App Store並不支持開源的Swift，只支持蘋果官方的Swift版本，官方版本會在新網站swift.org上定期與開源版本同步。

2015年12月，IBM宣布推出Swift Sandbox網站，該網站允許開發人員在一個窗口中編寫Swift代碼，並在另一個窗口中顯示輸出。該網站於2018年1月被棄用。

Linux發行版Ubuntu自Swift 2.2開始提供Swift的官方下載。從Swift 5.2.4起，包括CentOS、Amazon Linux在內的更多發行版加入其中。亦有用於Android的非官方生成工具鏈和SDK。

2016年6月13日，蘋果在WWDC2016上宣布將推出一款iPad專屬應用：Swift Playgrounds。該程序以3D遊戲的形式演示如何使用Swift編寫程序，編寫代碼時會實時提供反饋。

2017年1月，克里斯·拉特納宣布離開蘋果，並將加入特斯拉擔任新職位。Swift項目負責人由團隊資深人士泰德·克雷梅內克擔任。

2019年6月3日，蘋果在WWDC2019上發布了SwiftUI，同時發布了Xcode 11，為蘋果平台帶來了聲明式UI結構設計框架。

### 平台

Swift支持蘋果作業系統（Darwin/macOS、iOS、iPadOS、tvOS、watchOS、visionOS）和Linux、Windows及Android系統。

Swift的一個設計關鍵在於，它能夠與過去十幾年的大量現有Objective-C代碼（如Cocoa框架和Cocoa Touch框架）進行互操作。在蘋果平台上，Swift與Objective-C運行時庫連接，使得C、C++、Objective-C和Swift代碼能在同一個程序中運行。

### 版本歷史

版本｜發布日期｜macOS｜Linux｜Windows

Swift 1.0｜2014年9月9日｜是｜否｜否

Swift 1.1｜2014年10月22日｜是｜否｜否

Swift 1.2｜2015年4月8日｜是｜否｜否

Swift 2.0｜2015年9月21日｜是｜否｜否

Swift 2.1｜2015年10月20日｜是｜否｜否

Swift 2.2｜2016年3月21日｜是｜是｜否

Swift 2.2.1｜2016年5月3日｜是｜是｜否

Swift 3.0｜2016年9月13日｜是｜是｜否

Swift 3.0.1｜2016年10月28日｜是｜是｜否

Swift 3.0.2｜2016年12月13日｜是｜是｜否

Swift 3.1｜2017年3月27日｜是｜是｜否

Swift 3.1.1｜2017年4月21日｜是｜是｜否

Swift 4.0｜2017年9月19日｜是｜是｜否

Swift 4.0.2｜2017年11月1日｜是｜是｜否

Swift 4.0.3｜2017年12月5日｜是｜是｜否

Swift 4.1｜2018年3月29日｜是｜是｜否

Swift 4.1.1｜2018年5月4日｜否｜是｜否

Swift 4.1.2｜2018年5月31日｜是｜是｜否

Swift 4.1.3｜2018年7月27日｜否｜是｜否

Swift 4.2｜2018年9月17日｜是｜是｜否

Swift 4.2.1｜2018年10月30日｜是｜是｜否

Swift 4.2.2｜2019年2月4日｜否｜是｜否

Swift 4.2.3｜2019年2月28日｜否｜是｜否

Swift 4.2.4｜2019年3月29日｜否｜是｜否

Swift 5.0｜2019年3月25日｜是｜是｜否

Swift 5.0.1｜2019年4月18日｜是｜是｜否

Swift 5.0.2｜2019年7月15日｜否｜是｜否

Swift 5.0.3｜2019年8月30日｜否｜是｜否

Swift 5.1｜2019年9月10日｜是｜是｜否

Swift 5.1.1｜2019年10月11日｜否｜是｜否

Swift 5.1.2｜2019年11月7日｜是｜是｜否

Swift 5.1.3｜2019年12月13日｜是｜是｜否

Swift 5.1.4｜2020年1月31日｜否｜是｜否

Swift 5.1.5｜2020年3月9日｜否｜是｜否

Swift 5.2｜2020年3月24日｜是｜是｜否

Swift 5.2.1｜2020年3月30日｜否｜是｜否

Swift 5.2.2｜2020年4月15日｜是｜是｜否

Swift 5.2.3｜2020年4月29日｜否｜是｜否

Swift 5.2.4｜2020年5月20日｜是｜是｜否

Swift 5.2.5｜2020年8月5日｜否｜是｜否

Swift 5.3｜2020年9月16日｜是｜是｜是

Swift 5.3.1｜2020年11月13日｜是｜是｜是

Swift 5.3.2｜2020年12月15日｜是｜是｜是

Swift 5.3.3｜2021年1月25日｜否｜是｜是

Swift 5.4｜2021年4月26日｜是｜是｜是

Swift 5.4.1｜2021年5月25日｜否｜是｜是

Swift 5.4.2｜2021年6月28日｜是｜是｜是

Swift 5.4.3｜2021年9月9日｜否｜是｜是

Swift 5.5｜2021年9月20日｜是｜是｜是

Swift 5.5.1｜2021年10月27日｜是｜是｜是

Swift 5.5.2｜2021年12月14日｜是｜是｜是

Swift 5.5.3｜2022年2月9日｜否｜是｜是

Swift 5.6｜2022年3月14日｜是｜是｜是

Swift 5.6.1｜2022年4月9日｜否｜是｜是

Swift 5.6.2｜2022年6月15日｜否｜是｜是

Swift 5.6.3｜2022年9月2日｜否｜是｜是

Swift 5.7｜2022年9月12日｜是｜是｜是

Swift 5.7.1｜2022年11月1日｜是｜是｜是

Swift 5.8｜2023年3月30日｜是｜是｜是

Swift 5.8.1｜2023年6月1日｜是｜是｜是

Swift 5.9｜2023年9月18日｜是｜是｜是

## 特色

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

```objc
NSString *str = @"hello,";
str = [str stringByAppendingString:@" world"];
```

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

```swift
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）來管理記憶體。Apple以前要求在Objective-C中進行手動記憶體管理，但在2011年引入了ARC以簡化記憶體管理。在Objective-C中，強引用即為非ARC中的retain，而弱引用即為非ARC中的assign。不過，ARC的一個問題是可能創建一個強引用循環，即對象以一種可通過跟隨引用來到達起始對象的方式互相引用（例如，A引用B，B引用A），這會導致它們不被釋放而在記憶體中洩漏。Swift提供了關鍵字 `weak` 和 `unowned` 來防止強引用循環。其中，`weak` 不能設定為可空類型，不能加上問號（?）或驚嘆號（!）。通常，父子關係會使用強引用，而子父關係會使用`weak`引用，其中父和子可以沒有關聯，或者使用`unowned`，其中子始終有父，但父可能沒有子。弱引用必須是可選變量，因為它們可能會更改並變為`nil`。

類內的閉包也可以通過捕獲self引用來創建強引用循環。可以使用capture list指示將self引用視為弱引用或無主引用。

### 除錯以及其他元素

Xcode的除錯機制針對Swift語言提供REPL環境，可以利用Swift語法來evaluate或與其他程序互動，使Swift編程具有類似Python或Ruby帶有的交互性界面（Interactive Shell）等的特性而非傳統的系統程式語言的交互特性。REPL進一步增強了Swift Playgrounds的功能，後者是在Xcode環境中運行的交互式視圖，可以實時響應代碼或調試器的變化。

### 類似 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條件值, 諸如此類。
- 支援面向對象(Object-oriented programming)，即使Swift主張協定導向程式設計(Protocol-oriented programming)

### 不同於 Objective-C之處

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

## 範例代碼

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

變量聲明方式如下：

```objc
var implicitInteger = 70
var implicitDouble = 70.0
var explicitDouble: Double = 70
```

用 let 宣告常量方式如下：

```objc
let numberOfApples = 3
let numberOfOranges = 5
let appleSummary = "I have \(numberOfApples) apples."
let fruitSummary = "I have \(numberOfApples + numberOfOranges) pieces of fruit."
```

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

```objc
let table = "The width of this table is "
let width = 100
let tableWidth = table + String(width)
```

以下是Hello World程式：

```objc
println("Hello, world")
print("Hello, world") /*Swift 2.0 之後不再使用println，改使用print*/
```

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

```swift
let 人 = ["新": 67, "青": 8, "玉": 33, "小小": 25]
for (名字, 歲) in 人 {
  print("\(名字)是\(歲) 歲。")
}
```

## 基本資料

- 日語原文：Swift
- 編程范型：多範式（物件導向、泛函、指令式、組塊結構化）
- 發行日期：2014年6月2日
- 設計者：克里斯·拉特納與蘋果公司
- 開發者：蘋果公司
- 類型系統：靜態、強型別、類型推論
- 受影響於：Objective-C、Rust、Haskell、Ruby、Python、C#、CLU，和D語言
- 作業系統：蘋果公司的作業系統（Darwin, iOS, iPadOS, macOS, tvOS, watchOS）, Linux, Windows, Android
- 許可證：Apache許可證2.0（Swift 2.2及以後版本）、專有（直到Swift 2.2）
- 網站：https://www.swift.org/、https://developer.apple.com/swift/
- 文件擴展名：`.swift`