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

Quick Facts 編程範型, 設計者 ...
Swift
Thumb
編程範型範式物件導向泛函指令式組塊英語Block_(programming)結構化
設計者克里斯·拉特納蘋果公司
實作者蘋果公司
面市時間2014年6月2日,​10年前​(2014-06-02[1]
當前版本
  • 6.0.1(2024年9月27日;穩定版本)[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]
Close

歷史

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代碼能在同一個程序中運行。

版本歷史

More information 版本, 發布日期 ...
版本 發布日期 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日
Close

特色

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("\(名字)\() 歲。")
}

相關條目

參考資料

外部連結

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.