Swift語言
Swift程式語言,支援多編程範式和編譯式,用來撰寫基於macOS/OS X、iOS、iPadOS、watchOS、tvOS和visionOS的軟體[7]。 蘋果公司於2014年在蘋果開發者年會(WWDC)發布了Swift程式語言。從設計上蘋果公司讓Swift與Objective-C共存在蘋果公司的作業系統上[7]。
編程範型 | 多範式(物件導向、泛函、指令式、組塊結構化) |
---|---|
設計者 | 克里斯·拉特納與蘋果公司 |
實作者 | 蘋果公司 |
面市時間 | 2014年6月2日[1] |
目前版本 |
|
型態系統 | 靜態、強型別、類型推論 |
作業系統 | 蘋果公司的操作系統(Darwin, iOS, iPadOS, macOS, tvOS, watchOS), Linux, Windows 10, Android |
授權條款 | Apache授權條款2.0(Swift 2.2及以後版本) 專有(直到Swift 2.2)[3][4] |
副檔名 | .swift |
網站 | |
啟發語言 | |
Objective-C、Rust、Haskell、Ruby、Python、C#、CLU[5],和D語言[6] |
歷史
Swift是為了替代蘋果公司早期的Objective-C程式語言,該語言自20世紀80年代初以來基本沒有任何更新,缺乏現代語言功能。
2010年7月,蘋果開發者工具部門總監克里斯·拉特納開始著手 Swift 程式語言的設計工作,以一年時間,完成基本架構後,他領導了一個設計團隊參與其中,與蘋果的許多程式設計師共同開發,借鑑了Objective-C、Rust、Haskell、Ruby、Python、C#、CLU等許多其他語言的設計思想。[5]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很大程度是受到布雷特·維克多理念的啟發。[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起,包括CentOS、Amazon Linux在內的更多發行版加入其中。[15]亦有用於Android的非官方生成工具鏈和SDK。[16][17]
2016年6月13日,蘋果在WWDC2016上宣布將推出一款iPad專屬應用:Swift Playgrounds。該程式以3D遊戲的形式演示如何使用Swift編寫程式,編寫代碼時會即時提供回饋。[18][19][20]
2017年1月,克里斯·拉特納宣布離開蘋果,並將加入特斯拉擔任新職位。Swift專案負責人由團隊資深人士泰德·克雷梅內克擔任。[21][22]
2019年6月3日,蘋果在WWDC2019上釋出了SwiftUI,同時釋出了Xcode 11,為蘋果平台帶來了聲明式UI結構設計框架。[23]
平台
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[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"
過去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提供了關鍵字 weak
和 unowned
來防止強參照迴圈。其中,weak
不能設定為可空類型,不能加上問號(?)或驚嘆號(!)。通常,父子關係會使用強參照,而子父關係會使用weak
參照,其中父和子可以沒有關聯,或者使用unowned
,其中子始終有父,但父可能沒有子。弱參照必須是可選變數,因為它們可能會更改並變為nil
。[41]
類內的閉包也可以通過擷取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。
- 規避了C語言家族的易錯行為:
- 不存在指標。
- 賦值語句沒有返回值。若將
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)結尾加上分號。
變數聲明方式如下:
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("\(名字)是\(歲) 歲。")
}
相關條目
參考資料
- ^ Swift Has Reached 1.0. Apple. September 9, 2014 [March 8, 2015]. (原始內容存檔於2016-07-11).
- ^ Release 6.0.2. 2024年10月28日 [2024年12月1日].
- ^ 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.
- ^ 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.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>
標籤用不同內容定義了多次 - ^ 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.0 7.1 Apple announces Swift, a new programming language for iOS. (原始內容存檔於2015-12-26).
- ^ 苹果新编程语言Swift仅耗时4年完成开发. 網易科技報道. 2014-06-05. (原始內容存檔於2014-06-08).
- ^ Swift 2.0 - Swift Blog. developer.apple.com. [2019-06-12]. (原始內容存檔於2019-06-06) (美國英語).
- ^ Swift 2 Apps in the App Store. Swift Blog. [2016-03-13]. (原始內容存檔於2016-08-26).
- ^ Stack Overflow Developer Survey Results 2015. [2023-11-25]. (原始內容存檔於2016-12-31).
- ^ Stack Overflow Developer Survey Results 2016. [2023-11-25]. (原始內容存檔於2017-02-20).
- ^ 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)
- ^ Inc, Apple. Swift.org. Swift.org. [2019-06-12]. (原始內容存檔於2019-06-15) (英語).
- ^ Swift.org - Download Swift. [2020-06-21]. (原始內容存檔於2016-07-08).
- ^ Android SDKs for Swift. GitHub. [2021-09-10]. (原始內容存檔於2022-10-23).
- ^ swift-lang package versions. [2021-09-10]. (原始內容存檔於2024-03-24).
- ^ Swift Playgrounds. Apple Developer. [2016-06-19]. (原始內容存檔於2017-07-01).
- ^ Swift Playgrounds — Preview. Apple. [2016-06-19]. (原始內容存檔於2022-07-08) (美國英語).
- ^ Mayo, Benjamin. Apple announces Swift Playgrounds for iPad at WWDC, public release in fall. 9to5Mac. 2016-06-13 [2016-06-19]. (原始內容存檔於2022-06-30).
- ^ Cunningham, Andrew. Longtime Apple programmer and Swift creator leaves Apple for Tesla. Ars Technica. 2017-01-10 [2023-11-25]. (原始內容存檔於2017-02-18).
- ^ 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).
- ^ Daniel Eran Dilger. WWDC19: SwiftUI was the brightest star in a galaxy of new ideas. AppleInsider. [2019-07-19]. (原始內容存檔於2024-03-08) (英語).
- ^ Kremenek, Ted. Swift 5 Released!. Swift.org. 2019-03-25 [2019-03-28]. (原始內容存檔於2023-06-18) (英語).
- ^ Download Swift. Swift.org. Apple. [2020-12-15]. (原始內容存檔於2016-07-08).
- ^ Kremenek, Ted. Swift 5.4 Released!. Swift.org. Apple. 2021-04-26 [2021-04-26]. (原始內容存檔於2021-04-26) (英語).
- ^ Kremenek, Ted. Swift 5.6 Released!. Swift.org. Apple. 2022-03-14 [2022-03-14]. (原始內容存檔於2023-07-23) (英語).
- ^ Release Swift 5.6.1 Release · apple/Swift. GitHub. [2023-11-25]. (原始內容存檔於2022-04-10).
- ^ Release Swift 5.6.2 Release · apple/Swift. GitHub. [2023-11-25]. (原始內容存檔於2024-04-18).
- ^ Release Swift 5.6.3 Release · apple/Swift. GitHub. [2023-11-25]. (原始內容存檔於2024-02-04).
- ^ Borla, Holly. Swift 5.7 Released!. Swift.org. Apple. 2022-09-12 [2022-09-23]. (原始內容存檔於2024-04-03) (英語).
- ^ Release Swift 5.7.1 Release · apple/Swift. GitHub. [2023-11-25]. (原始內容存檔於2024-02-04).
- ^ Release Swift 5.8 Release · apple/Swift. GitHub. [2023-11-25]. (原始內容存檔於2024-02-04).
- ^ Release Swift 5.8.1 Release · apple/swift. GitHub. [2023-06-14]. (原始內容存檔於2024-02-04) (英語).
- ^ Release Swift 5.9 Release · apple/swift. GitHub. [2023-09-18]. (原始內容存檔於2024-02-04) (英語).
- ^ Weber, Harrison. Apple announces ‘Swift,’ a new programming language for OS X & iOS. VentureBeat. 2014-06-02 [2014-06-10]. (原始內容存檔於2016-11-17).
- ^ "Strings and Characters" (頁面存檔備份,存於網際網路檔案館), Apple Inc.
- ^ "Do Swift-based apps work on OS X 10.9/iOS 7 and lower?" (頁面存檔備份,存於網際網路檔案館), StackOverflow
- ^ "Swift and Objective-C in the Same Project" (頁面存檔備份,存於網際網路檔案館), Apple Inc.
- ^ Documentation. docs.swift.org. [2023-07-08]. (原始內容存檔於2023-09-20).
- ^ Lanier, Brian; Groff, Joe. Intermediate Swift. Apple. [July 3, 2014]. (原始內容存檔於2014-07-03).
- ^ The Swift Programming Language (頁面存檔備份,存於網際網路檔案館).