Swift語言

蘋果公司開發的編程語言

Swift程式語言,支援多編程範式編譯式,用來撰寫基於macOS/OS XiOSiPadOSwatchOStvOSvisionOS的軟體[7]。 蘋果公司於2014年在蘋果開發者年會(WWDC)發布了Swift程式語言。從設計上蘋果公司讓Swift與Objective-C共存在蘋果公司的作業系統[7]

Swift
編程範型範式物件導向泛函指令式組塊英語Block_(programming)結構化
設計者克里斯·拉特納蘋果公司
實作者蘋果公司
面市時間2014年6月2日,​10年前​(2014-06-02[1]
目前版本
  • 6.0.2(2024年10月28日;穩定版本)[2]
編輯維基數據鏈結
型態系統靜態、強型別類型推論
作業系統蘋果公司的操作系統(Darwin, iOS, iPadOS, macOS, tvOS, watchOS), Linux, Windows 10, Android
授權條款Apache授權條款2.0(Swift 2.2及以後版本)
專有(直到Swift 2.2)[3][4]
副檔名.swift
網站
啟發語言
Objective-CRustHaskellRubyPythonC#CLU[5],和D語言[6]

歷史

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

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

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

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

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

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

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

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

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

2016年6月13日,蘋果在WWDC2016上宣布將推出一款iPad專屬應用:Swift Playgrounds英語Swift Playgrounds。該程式以3D遊戲的形式演示如何使用Swift編寫程式,編寫代碼時會即時提供回饋。[18][19][20]

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

2019年6月3日,蘋果在WWDC2019上釋出了SwiftUI英語SwiftUI,同時釋出了Xcode 11,為蘋果平台帶來了聲明式UI結構設計框架。[23]

平台

Swift支援蘋果作業系統(Darwin/macOSiOSiPadOStvOSwatchOSvisionOS)和LinuxWindowsAndroid系統。

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[24] 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日 [25]
Swift 5.3.1 2020年11月13日
Swift 5.3.2 2020年12月15日
Swift 5.3.3 2021年1月25日
Swift 5.4[26] 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[27] 2022年3月14日
Swift 5.6.1[28] 2022年4月9日
Swift 5.6.2[29] 2022年6月15日
Swift 5.6.3[30] 2022年9月2日
Swift 5.7[31] 2022年9月12日
Swift 5.7.1[32] 2022年11月1日
Swift 5.8[33] 2023年3月30日
Swift 5.8.1[34] 2023年6月1日
Swift 5.9[35] 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)。[36]

類型和變數

在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"

[37]

過去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或更高的版本。[38] 更重要的, 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".[39]

主記憶體管理

Swift使用自動參照計數(ARC)來管理主記憶體。Apple以前要求在Objective-C中進行手動主記憶體管理,但在2011年引入了ARC以簡化主記憶體管理。[40]在Objective-C中,強參照即為非ARC中的retain,而弱參照即為非ARC中的assign。不過,ARC的一個問題是可能建立一個強參照迴圈,即對象以一種可通過跟隨參照來到達起始對象的方式互相參照(例如,A參照B,B參照A),這會導致它們不被釋放而在主記憶體中洩漏。Swift提供了關鍵字 weakunowned 來防止強參照迴圈。其中,weak 不能設定為可空類型,不能加上問號(?)或驚嘆號(!)。通常,父子關係會使用強參照,而子父關係會使用weak參照,其中父和子可以沒有關聯,或者使用unowned,其中子始終有父,但父可能沒有子。弱參照必須是可選變數,因為它們可能會更改並變為nil[41]

類內的閉包也可以通過擷取self參照來建立強參照迴圈。可以使用capture list指示將self參照視為弱參照或無主參照。

除錯以及其他元素

Xcode的除錯機制針對Swift語言提供REPL環境,可以利用Swift語法來evaluate或於其他程式互動,使Swift編程具有類似PythonRuby帶有的互動性介面(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
  • 規避了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免費下載。[42]

範例代碼

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

變數聲明方式如下:

var implicitInteger = 70
var implicitDouble = 70.0
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 2.0 之後不再使用println,改使用print*/

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

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

相關條目

參考資料

  1. ^ Swift Has Reached 1.0. Apple. September 9, 2014 [March 8, 2015]. (原始內容存檔於2016-07-11). 
  2. ^ Release 6.0.2. 2024年10月28日 [2024年12月1日]. 
  3. ^ Swift, Objectively. [2022-04-09]. (原始內容存檔於2022-01-08). Swift is proprietary and closed: It is entirely controlled by Apple and there is no open source implementation. 
  4. ^ Lattner, Chris. Re: [LLVMdev] [cfe-dev] [Advertisement] open positions in Apple's Swift compiler team. June 11, 2014 [June 12, 2014]. (原始內容存檔於2014-07-14). You can imagine that many of us want it to be open source and part of LLVM, but the discussion hasn't happened yet, and won't for some time. 
  5. ^ 5.0 5.1 Lattner, Chris. Chris Lattner's Homepage. Chris Lattner. 2014-06-03 [2014-06-03]. (原始內容存檔於2015-12-22). I started work on the Swift Programming Language in July of 2010. I implemented much of the basic language structure, with only a few people knowing of its existence. A few other (amazing) people started contributing in earnest late in 2011, and it became a major focus for the Apple Developer Tools group in July 2013 [...] drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.  參照錯誤:帶有name屬性「lattner 2014 info 1」的<ref>標籤用不同內容定義了多次
  6. ^ Building assert() in Swift, Part 2: __FILE__ and __LINE__ - Swift B log -. Apple Developer. [2014-09-26]. (原始內容存檔於2015-11-21). Swift borrows a clever feature from the D language: these identifiers expand to the location of the caller when evaluated in a default argument list. 
  7. ^ 7.0 7.1 Apple announces Swift, a new programming language for iOS. (原始內容存檔於2015-12-26). 
  8. ^ 苹果新编程语言Swift仅耗时4年完成开发. 網易科技報道. 2014-06-05. (原始內容存檔於2014-06-08). 
  9. ^ Swift 2.0 - Swift Blog. developer.apple.com. [2019-06-12]. (原始內容存檔於2019-06-06) (美國英語). 
  10. ^ Swift 2 Apps in the App Store. Swift Blog. [2016-03-13]. (原始內容存檔於2016-08-26). 
  11. ^ Stack Overflow Developer Survey Results 2015. [2023-11-25]. (原始內容存檔於2016-12-31). 
  12. ^ Stack Overflow Developer Survey Results 2016. [2023-11-25]. (原始內容存檔於2017-02-20). 
  13. ^ The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub, Apple, 2019-06-12 [2019-06-12], (原始內容存檔於2019-06-12) 
  14. ^ Inc, Apple. Swift.org. Swift.org. [2019-06-12]. (原始內容存檔於2019-06-15) (英語). 
  15. ^ Swift.org - Download Swift. [2020-06-21]. (原始內容存檔於2016-07-08). 
  16. ^ Android SDKs for Swift. GitHub. [2021-09-10]. (原始內容存檔於2022-10-23). 
  17. ^ swift-lang package versions. [2021-09-10]. (原始內容存檔於2024-03-24). 
  18. ^ Swift Playgrounds. Apple Developer. [2016-06-19]. (原始內容存檔於2017-07-01). 
  19. ^ Swift Playgrounds — Preview. Apple. [2016-06-19]. (原始內容存檔於2022-07-08) (美國英語). 
  20. ^ Mayo, Benjamin. Apple announces Swift Playgrounds for iPad at WWDC, public release in fall. 9to5Mac. 2016-06-13 [2016-06-19]. (原始內容存檔於2022-06-30). 
  21. ^ Cunningham, Andrew. Longtime Apple programmer and Swift creator leaves Apple for Tesla. Ars Technica. 2017-01-10 [2023-11-25]. (原始內容存檔於2017-02-18). 
  22. ^ Wuerthele, Mike. New Swift project head Ted Kremenek said to be running the show behind the scenes for some time. AppleInsider. 2017-01-13 [2023-11-25]. (原始內容存檔於2024-04-16). 
  23. ^ Daniel Eran Dilger. WWDC19: SwiftUI was the brightest star in a galaxy of new ideas. AppleInsider. [2019-07-19]. (原始內容存檔於2024-03-08) (英語). 
  24. ^ Kremenek, Ted. Swift 5 Released!. Swift.org. 2019-03-25 [2019-03-28]. (原始內容存檔於2023-06-18) (英語). 
  25. ^ Download Swift. Swift.org. Apple. [2020-12-15]. (原始內容存檔於2016-07-08). 
  26. ^ Kremenek, Ted. Swift 5.4 Released!. Swift.org. Apple. 2021-04-26 [2021-04-26]. (原始內容存檔於2021-04-26) (英語). 
  27. ^ Kremenek, Ted. Swift 5.6 Released!. Swift.org. Apple. 2022-03-14 [2022-03-14]. (原始內容存檔於2023-07-23) (英語). 
  28. ^ Release Swift 5.6.1 Release · apple/Swift. GitHub. [2023-11-25]. (原始內容存檔於2022-04-10). 
  29. ^ Release Swift 5.6.2 Release · apple/Swift. GitHub. [2023-11-25]. (原始內容存檔於2024-04-18). 
  30. ^ Release Swift 5.6.3 Release · apple/Swift. GitHub. [2023-11-25]. (原始內容存檔於2024-02-04). 
  31. ^ Borla, Holly. Swift 5.7 Released!. Swift.org. Apple. 2022-09-12 [2022-09-23]. (原始內容存檔於2024-04-03) (英語). 
  32. ^ Release Swift 5.7.1 Release · apple/Swift. GitHub. [2023-11-25]. (原始內容存檔於2024-02-04). 
  33. ^ Release Swift 5.8 Release · apple/Swift. GitHub. [2023-11-25]. (原始內容存檔於2024-02-04). 
  34. ^ Release Swift 5.8.1 Release · apple/swift. GitHub. [2023-06-14]. (原始內容存檔於2024-02-04) (英語). 
  35. ^ Release Swift 5.9 Release · apple/swift. GitHub. [2023-09-18]. (原始內容存檔於2024-02-04) (英語). 
  36. ^ Weber, Harrison. Apple announces ‘Swift,’ a new programming language for OS X & iOS. VentureBeat. 2014-06-02 [2014-06-10]. (原始內容存檔於2016-11-17). 
  37. ^ "Strings and Characters"頁面存檔備份,存於網際網路檔案館), Apple Inc.
  38. ^ "Do Swift-based apps work on OS X 10.9/iOS 7 and lower?"頁面存檔備份,存於網際網路檔案館), StackOverflow
  39. ^ "Swift and Objective-C in the Same Project"頁面存檔備份,存於網際網路檔案館), Apple Inc.
  40. ^ Documentation. docs.swift.org. [2023-07-08]. (原始內容存檔於2023-09-20). 
  41. ^ Lanier, Brian; Groff, Joe. Intermediate Swift. Apple. [July 3, 2014]. (原始內容存檔於2014-07-03). 
  42. ^ The Swift Programming Language頁面存檔備份,存於網際網路檔案館).

外部連結