Swift 程式語言，支援多程式設計正規化和編譯式，用來撰寫基於 macOSOS X、iOS、iPadOS、watchOS、tvOS 和 visionOS 的軟體。 蘋果公司於 2014 年在蘋果開發者年會（WWDC）發布了 Swift 程式語言。從設計上蘋果公司讓 Swift 與 ObjectiveC 共存在蘋果公司的作業系統上。 歷史 Swift 是為了替代蘋果公司早期的 ObjectiveC 程式語言，該語言自 20 世紀 80 年代初以來基本沒有任何更新，缺乏現代語言功能。 2010 年 7 月，蘋果開發者工具部門總監克里斯拉特納開始著手 Swift 程式語言的設計工作，以一年時間，完成基本架構後，他領導了一個設計團隊參與其中，與蘋果的許多程式設計師共同開發，借鑑了 ObjectiveC、Rust、Haskell、Ruby、Python、C、CLU 等許多其他語言的設計思想。2014 年 6 月 2 日，蘋果在 WWDC 上釋出了第一個公開的使用 Swift 編寫的應用程式：WWDC 應用程式，同時向蘋果的註冊開發者釋出了 Swift 語言的測試版，但未承諾最終版本與測試版本的原始碼相互相容。大會也釋出了長達 500 頁的官方指南，The Swift Programming Language，在 Apple Books 和官方網站上免費提供。蘋果計劃在完整版釋出時，如果有必要，將會提供原始碼轉換器。 蘋果宣稱 Swift 的特點是：快速、現代、安全、互動，而且明顯優於 ObjectiveC 語言。Swift 以 LLVM 編譯，可以使用現有的 Cocoa 和 Cocoa Touch 框架。Xcode Playgrounds 功能是 Swift 為蘋果開發工具帶來的最大創新，該功能提供強大的互動效果，能讓 Swift 原始碼在 REPL 撰寫過程中能即時顯示出其執行結果。拉特納本人強調，Playgrounds 很大程度是受到理念的啟發。 2014 年 9 月 9 日，Swift 10 和 iOS 8、Xcode 60 的 Golden Master 版本一同釋出，達成了一個重要的里程碑。 2015 年 6 月 8 日，蘋果於 WWDC2015 上釋出了 Swift 20。同時宣佈，未來 Swift 將開放原始碼，包括編譯器和標準庫。2015 年 9 月 21 日起，可在 App Store 釋出以 Swift 編寫的應用。 Swift 在 2015 年 Stack Overflow 開發者調查中榮獲 最受歡迎的程式語言 第一名，並在 2016 年榮獲第二名。 2015 年 12 月 3 日，蘋果宣佈開源 Swift，並支援 Linux，蘋果在新網站 swiftorg 和託管網站 Github 上開源了 Swift，但蘋果的 App Store 並不支援開源的 Swift，只支援蘋果官方的 Swift 版本，官方版本會在新網站 swiftorg 上定期與開源版本同步。 2015 年 12 月，IBM 宣佈推出 Swift Sandbox 網站，該網站允許開發人員在一個視窗中編寫 Swift 程式碼，並在另一個視窗中顯示輸出。該網站於 2018 年 1 月被棄用。 Linux 發行版 Ubuntu 自 Swift 22 開始提供 Swift 的官方下載。從 Swift 524 起，包括 CentOS、Amazon Linux 在內的更多發行版加入其中。亦有用於 Android 的非官方生成工具鏈和 SDK。 2016 年 6 月 13 日，蘋果在 WWDC2016 上宣佈將推出一款 iPad 專屬應用：。該程式以 3D 遊戲的形式演示如何使用 Swift 編寫程式，編寫程式碼時會即時提供反饋。 2017 年 1 月，克里斯拉特納宣佈離開蘋果，並將加入特斯拉擔任新職位。Swift 專案負責人由團隊資深人士泰德克雷梅內克擔任。 2019 年 6 月 3 日，蘋果在 WWDC2019 上釋出了，同時釋出了 Xcode 11，為蘋果平臺帶來了宣告式 UI 結構設計框架。 平臺 Swift 支援蘋果作業系統（DarwinmacOS、iOS、iPadOS、tvOS、watchOS、visionOS）和 Linux、Windows 及 Android 系統。 Swift 的一個設計關鍵在於，它能夠與過去十幾年的大量現有 ObjectiveC 程式碼（如 Cocoa 框架和 Cocoa Touch 框架）進行互操作。在蘋果平臺上，Swift 與 ObjectiveC 執行時庫連線，使得 C、C、ObjectiveC 和 Swift 程式碼能在同一個程式中執行。 版本歷史 版本 釋出日期 macOS Linux Windows Swift 10 2014 年 9 月 9 日 Swift 11 2014 年 10 月 22 日 Swift 12 2015 年 4 月 8 日 Swift 20 2015 年 9 月 21 日 Swift 21 2015 年 10 月 20 日 Swift 22 2016 年 3 月 21 日 Swift 221 2016 年 5 月 3 日 Swift 30 2016 年 9 月 13 日 Swift 301 2016 年 10 月 28 日 Swift 302 2016 年 12 月 13 日 Swift 31 2017 年 3 月 27 日 Swift 311 2017 年 4 月 21 日 Swift 40 2017 年 9 月 19 日 Swift 402 2017 年 11 月 1 日 Swift 403 2017 年 12 月 5 日 Swift 41 2018 年 3 月 29 日 Swift 411 2018 年 5 月 4 日 Swift 412 2018 年 5 月 31 日 Swift 413 2018 年 7 月 27 日 Swift 42 2018 年 9 月 17 日 Swift 421 2018 年 10 月 30 日 Swift 422 2019 年 2 月 4 日 Swift 423 2019 年 2 月 28 日 Swift 424 2019 年 3 月 29 日 Swift 50 2019 年 3 月 25 日 Swift 501 2019 年 4 月 18 日 Swift 502 2019 年 7 月 15 日 Swift 503 2019 年 8 月 30 日 Swift 51 2019 年 9 月 10 日 Swift 511 2019 年 10 月 11 日 Swift 512 2019 年 11 月 7 日 Swift 513 2019 年 12 月 13 日 Swift 514 2020 年 1 月 31 日 Swift 515 2020 年 3 月 9 日 Swift 52 2020 年 3 月 24 日 Swift 521 2020 年 3 月 30 日 Swift 522 2020 年 4 月 15 日 Swift 523 2020 年 4 月 29 日 Swift 524 2020 年 5 月 20 日 Swift 525 2020 年 8 月 5 日 Swift 53 2020 年 9 月 16 日 Swift 531 2020 年 11 月 13 日 Swift 532 2020 年 12 月 15 日 Swift 533 2021 年 1 月 25 日 Swift 54 2021 年 4 月 26 日 Swift 541 2021 年 5 月 25 日 Swift 542 2021 年 6 月 28 日 Swift 543 2021 年 9 月 9 日 Swift 55 2021 年 9 月 20 日 Swift 551 2021 年 10 月 27 日 Swift 552 2021 年 12 月 14 日 Swift 553 2022 年 2 月 9 日 Swift 56 2022 年 3 月 14 日 Swift 561 2022 年 4 月 9 日 Swift 562 2022 年 6 月 15 日 Swift 563 2022 年 9 月 2 日 Swift 57 2022 年 9 月 12 日 Swift 571 2022 年 11 月 1 日 Swift 58 2023 年 3 月 30 日 Swift 581 2023 年 6 月 1 日 Swift 59 2023 年 9 月 18 日 特色 Swift 取消了 ObjectiveC 的指標和其他不安全存取的使用，捨棄了 Objective C 早期套用 Smalltalk 風格的語法，全面改為句點表示法（dotnotation）。Swift 具備型別推導（type inference）。同時，它提供了類似 C、C 中的名稱空間（namespace）、泛型（generic）、運算子過載（operator overloading）。Swift 被簡單的形容為 沒有 C 的 ObjectiveC（ObjectiveC without the C）。 型別和變數 在 Cocoa 與 Cocoa Touch 的環境下，許多共用的類都放在 Foundation Kit 庫下，這些類別包含了 NSString 字串庫（使用 Unicode），還有集合類別 NSArray 與 NSDictionary。ObjectiveC 提供了語法糖的方式讓這些物件可以整合在同一個語言裡。例如 NSString 之間合併的表示法如下： NSString str hello str str stringByAppendingStringworld 在 Swift 裡，字串的累積可以用加法運算元作為頭等物件（Firstclass citizen）的方式直接完成，上述的例子可以簡化為 var strhello str worldStrings and Characters Apple Inc 過去 Cocoa（以及 Cocoa Touch）的架構總是被分成兩種版本，一種是可變的（mutable），也就是可以在執行時期（runtime）改變；另一種是不可變的（immutable），其初始值不可改變，例如 NSArray 與 NSMutableArray 就是陣列的兩種版本。Swift 語言延續這個傳統，但簡化為使用 let 關鍵字去設定常數（constant variable）。可變的 Mutable 物件使用 var 關鍵字，不可變的物件則適用 let 關鍵字。Swift 語言使用類似 C 或 Javascript 的 var 定義變數，但特性又不盡相同。Swift 不直接指派初始值給變數，變數無預設值，因此使用 var 變數之前必須先初始化，不然將發生編譯時期的錯誤。 為了方便使用，Swift 提供 Optional 型別來宣告 nilfree references。宣告 Optional 只需要在型別後面加上問號即可。一旦 var 變數宣告為 Optional 的，其初始值就會被預設為 nil。Optional 本質上是 enum，定義了 None 和 Some 兩種型別，nil 即是 OptionalNone。 函式庫、執行時期與部署 Swift 在 Mac OS 和 iOS 平臺可以和 ObjectiveC 使用相同的 zhhans 執行時；zhhant 執行期（runtime），因此 Swift 程式能執行在目前已存在的平臺上，包括 iOS 6 和 OS X 108 或更高的版本。Do Swiftbased apps work on OS X 109iOS 7 and lower StackOverflow 更重要的，Swift 和 ObjectiveC 的程式碼可並存於同一程式程式碼，這種延伸就如同 C 和 C 的關係一樣。 為了吸引開發人員和複用已存在的程式碼，Xcode 6 允許在 app target 匯入 ObjectiveC 標頭檔案供給 Swift 使用，透過 ObjectiveC 的橋接標頭檔案（bridging header）來供給 Swift。當開發人員新增 Swift 檔案到現有的 ObjectiveC 應用程式時，Xcode 自動建立相應的標頭檔案。例如，一個 Swift 類 MyClass 可用於 ObjectiveC 的方式為 import MyClassSwifthSwift and ObjectiveC in the Same Project Apple Inc 記憶體管理 Swift 使用自動引用計數（ARC）來管理記憶體。Apple 以前要求在 ObjectiveC 中進行手動記憶體管理，但在 2011 年引入了 ARC 以簡化記憶體管理。在 ObjectiveC 中，強引用即為非 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 環境中執行的互動式檢視，可以即時響應程式碼或偵錯程式的變化。 類似 ObjectiveC 之處 基本數值型別（numeric types）大致相同（如 Int UInt Float Double） 大量的 C 語言運算子被移出 Swift 例 與此同時引入了新運算子。 大括號被用於群組陳述（group statements）。 變數之賦值使用等於符號，但比較則使用 連續兩個等於運算元。還有一個新的運算元，連續三個等於被用來判斷常數或變數之間是否為同一物件之例項（instance）。 中括號（ Square brackets）用於陣列的表示，宣告陣列之後，可以指派索引值（index）來進行元素（element）之存取。 控制陳述（control statement） for while if switch 與 ObjectiveC 都十分類似，但有延伸功能，像是 for in 用於集合（collection）的輪詢，switch 還可以接受非整數的 cases 條件值，諸如此類。 支援面向物件 Objectoriented programming，即使 Swift 主張協定導向程式設計 Protocoloriented programming 不同於 ObjectiveC 之處 語句（statement）不需要用分號結束，但分號可以作為一行上兩個以上語句的分割符。 不需要標頭檔案（Header files）。 註解方式 巢狀，指註釋裡可以再有註釋。 強型別 型別推論或隱含型別（Type inference） 支援泛型程式設計。 函式成為第一等型別（firstclass object），這意味著函式可以作為其他函式的引數和返回值。 運算子過載。運算子可在類內重新定義。 定義新的運算子。 字串全方面支援 Unicode。 規避了 C 語言家族的易錯行為： 不存在指標。 賦值語句沒有返回值。若將 if i0 誤寫成 if i0，將造成編譯時期錯誤。 在 switch 的區塊內不需要使用 break 語句。另外，case 後面都需要有可執行的程式碼（C 或 C 可連續使用多個 case 而不需要額外的程式碼），否則將觸發編譯錯誤。 變數和常量必須初始化才能使用，而且陣列（array）的邊界必須明確確認。 溢位（overflows）的問題。C 語言沒有強制整數型別（signed integers）的界限，常常在觸發執行時期錯誤。Swift 透過整數型別的 max 或 min 屬性獲取最大值或最小值。 討論 長達 600 多頁的 The Swift Programming Language 可以在 iBooks 免費下載。The Swift Programming Language 範例程式碼 Swift 不需要引入標頭檔案（header file）或 main 函式，不需要在每一行語句（statement）結尾加上分號。 變數宣告方式如下： var implicitInteger 70 var implicitDouble 700 var explicitDouble Double 70 用 let 宣告常量方式如下： 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）： let table The width of this table is let width 100 let tableWidth table String width 以下是 Hello World 程式： println Hello world print Hello world Swift 20 之後不再使用 println，改使用 print 使用 Unicode 字元，例如在文字中放心新增有不同語言的文字 let 人 新 67 青 8 玉 33 小小 25 for 名字，歲 in 人 print 名字 是 歲 歲。 相關條目 ObjectiveC C 語言 參考資料 外部連結 蘋果開發者上的 Swift iOS Example Category 蘋果公司 CategoryMacOS 開發 CategoryIOS 開發 Category 面向物件的程式語言 Category 靜態型別程式語言 Category 模式匹配程式語言 Category 系統程式語言 Category2014 年建立的程式語言