Swift語言

Swift編程語言，支持多编程范式和編譯式，用来撰写基于macOS/OS X、iOS、iPadOS、watchOS、tvOS和visionOS的软件。
苹果公司于2014年在苹果开发者年会（WWDC）發布了Swift编程语言。从设计上苹果公司让Swift与Objective-C共存在苹果公司的操作系统上。

歷史
Swift是为了替代苹果公司早期的Objective-C编程语言，该语言自20世纪80年代初以来基本没有任何更新，缺乏现代语言功能。

2010年7月，苹果开发者工具部门总监克里斯·拉特納开始着手 Swift 编程语言的設計工作，以一年時間，完成基本架構後，他領導了一個設計團隊參與其中，与苹果的许多程序员共同开发，借鉴了Objective-C、Rust、Haskell、Ruby、Python、C#、CLU等许多其他语言的設計思想。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很大程度是受到理念的启发。

2014年9月9日，Swift 1.0和iOS 8、Xcode 6.0的Golden Master版本一同发布，达成了一个重要的里程碑。

2015年6月8日，蘋果於WWDC2015上发布了Swift 2.0。同时宣布，未来Swift將開放原始碼，包括编译器和标准库。2015年9月21日起，可在App Store发布以Swift编写的应用。

Swift在2015年Stack Overflow开发者调查中荣获“最受欢迎的编程语言”第一名，并在2016年荣获第二名。

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

2015年12月，IBM宣布推出Swift Sandbox网站，该网站允许开发人员在一个窗口中编写Swift代码，并在另一个窗口中显示输出。该网站于2018年1月被弃用。

Linux发行版Ubuntu自Swift 2.2开始提供Swift的官方下载。从Swift 5.2.4起，包括CentOS、Amazon Linux在内的更多发行版加入其中。亦有用于Android的非官方生成工具链和SDK。

2016年6月13日，苹果在WWDC2016上宣布将推出一款iPad专属应用：。该程序以3D游戏的形式演示如何使用Swift编写程序，编写代码时会实时提供反馈。

2017年1月，克里斯·拉特纳宣布离开苹果，并将加入特斯拉担任新职位。Swift项目负责人由团队资深人士泰德·克雷梅内克担任。

2019年6月3日，苹果在WWDC2019上发布了，同时发布了Xcode 11，为苹果平台带来了声明式UI结构设计框架。

 平台 
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 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日    Swift 5.3.1 2020年11月13日    Swift 5.3.2 2020年12月15日    Swift 5.3.3 2021年1月25日    Swift 5.4 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 2022年3月14日    Swift 5.6.1 2022年4月9日    Swift 5.6.2 2022年6月15日    Swift 5.6.3 2022年9月2日    Swift 5.7 2022年9月12日    Swift 5.7.1 2022年11月1日   Swift 5.8 2023年3月30日Swift 5.8.12023年6月1日Swift 5.92023年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）。

類型和變量
在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""Strings 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类型来宣告nil-free references。宣告Optional只需要在类型后面加上問號（?）即可。一旦var变量宣告为Optional的，其初始值就會被預設為nil。Optional本質上是enum，定义了None和Some两种类型，nil即是Optional.None。

函数库、执行时期与部署
Swift在 Mac OS 和 iOS 平台可以和 Objective-C 使用相同的-{zh-hans:运行时; zh-hant:執行期}-（runtime），因此Swift 程序能运行在目前已存在的平台上，包括 iOS 6 和 OS X 10.8或更高的版本。"Do Swift-based apps work on OS X 10.9/iOS 7 and lower?" , StackOverflow 更重要的, 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"."Swift and Objective-C in the Same Project" , Apple Inc.

内存管理
Swift使用自动引用计数（ARC）来管理内存。Apple以前要求在Objective-C中进行手动内存管理，但在2011年引入了ARC以简化内存管理。在Objective-C中，强引用即为非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环境中运行的交互式视图，可以实时响应代码或调试器的变化。

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

 相关条目 
 Objective-C
C语言

参考资料

外部链接

 苹果开发者上的Swift
iOS Example

 The Swift Programming LanguageThe Swift Programming Language .

Category:苹果公司
Category:MacOS開發
Category:IOS開發
Category:面向对象的编程语言
Category:静态类型编程语言
Category:模式匹配编程语言
Category:系統程式語言
Category:2014年建立的程式語言