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.