热门问题
时间线
聊天
视角

Swift語言

蘋果公司開發的編程語言 来自维基百科,自由的百科全书

Remove ads

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

事实速览 編程範型, 設計者 ...
Remove ads

歷史

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]

Remove ads

平台

Swift支持蘋果操作系統(Darwin/macOSiOSiPadOStvOSwatchOSvisionOS)和LinuxWindowsAndroid系統。

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

版本歷史

更多信息 版本, 發布日期 ...
Remove ads

特色

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。

Remove ads

函數庫、執行時期與部署

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]

Remove ads

內存管理

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引用視為弱引用或無主引用。

Remove ads

除錯以及其他元素

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屬性獲取最大值或最小值。
Remove ads

討論

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

相關條目

參考資料

外部連結

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads