Swift (编程语言)

Swift编程语言,支持多编程范式编译式,用来撰写基于macOS/OS XiOSiPadOSwatchOStvOS的软件[7]。 苹果公司于2014年在苹果开发者年会(WWDC)发布了Swift编程语言。从设计上苹果公司让Swift与Objective-C共存在苹果公司的操作系统[7]

Swift
Swift logo.svg
编程范型范型面向对象泛函指令式组块英语Block_(programming)结构化
设计者克里斯·拉特纳苹果公司
实现者苹果公司
发行时间2014年6月2日,​8年前​(2014-06-02[1]
当前版本
  • 5.7.3 (2023年1月19日)[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]

历史

2010年7月,苹果开发者工具部门总监克里斯·拉特纳开始着手 Swift 编程语言的设计工作,以一年时间,完成基本架构后,他领导了一个设计团队参与其中。Swift大约历经4年的开发期,2014年6月发表。

苹果宣称Swift的特点是:快速、现代、安全、互动,而且明显优于Objective-C语言。Swift以LLVM编译,可以使用现有的CocoaCocoa Touch框架。Xcode Playgrounds功能是Swift为苹果开发工具带来的最大创新,该功能提供强大的互动效果,能让Swift源代码在撰写过程中能即时显示出其执行结果。拉特纳本人强调,Playgrounds很大程度是受到布雷特·维克多英语Bret Victor理念的启发。[8]

2015年6月8日,苹果于WWDC2015上宣布,Swift将开放源代码,包括编译器标准库[9]

2015年12月3日,苹果宣布开源Swift,并支持Linux,苹果在新网站swift.org和托管网站Github上开源了Swift,但苹果的App Store并不支持开源的Swift,只支持苹果官方的Swift版本,官方版本会在新网站swift.org上定期与开源版本同步。[10][11]

特色

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)。[12]

类型和变量

在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"

[13]

过去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或更高的版本。[14] 更重要的, 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".[15]

内存管理

Swift全面使用自动引用计数(ARC)来管理内存,取代Objective C的垃圾回收功能。在Objective-C中,强引用(strong reference)即为非ARC中的retain,而弱引用(weak reference)即为非ARC中的assign。为了解决循环引用的问题,Swift提供unowned,不能设定为optional types,不能加上问号(?)或惊叹号(!)。

调试以及其他元素

Xcode的调试机制针对Swift语言提供REPL(Read-Eval-Print Loop, 这是源自emacs的术语)环境,可以利用Swift语法来评估或于其他程序互动,使Swift编程具有类似PythonRuby带有的交互性界面(Interactive Shell)。

类似 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条件值, 诸如此类。

不同于 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免费下载。[16]

范例代码

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语言

参考资料

  1. ^ Swift Has Reached 1.0. Apple. September 9, 2014 [March 8, 2015]. (原始内容存档于2016-07-11). 
  2. ^ 2.0 2.1 Release 5.7.3. 2023年1月19日 [2023年1月25日]. 
  3. ^ 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. 
  4. ^ 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. ^ 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. 
  6. ^ 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. ^ 7.0 7.1 Apple announces Swift, a new programming language for iOS. (原始内容存档于2015-12-26). 
  8. ^ 苹果新编程语言Swift仅耗时4年完成开发. 网易科技报道. 2014-06-05. (原始内容存档于2014-06-08). 
  9. ^ Swift 2.0 - Swift Blog. developer.apple.com. [2019-06-12]. (原始内容存档于2019-06-06) (美国英语). 
  10. ^ 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) 
  11. ^ Inc, Apple. Swift.org. Swift.org. [2019-06-12]. (原始内容存档于2019-06-15) (英语). 
  12. ^ Weber, Harrison. Apple announces ‘Swift,’ a new programming language for OS X & iOS. VentureBeat. 2014-06-02 [2014-06-10]. (原始内容存档于2016-11-17). 
  13. ^ "Strings and Characters"页面存档备份,存于互联网档案馆), Apple Inc.
  14. ^ "Do Swift-based apps work on OS X 10.9/iOS 7 and lower?"页面存档备份,存于互联网档案馆), StackOverflow
  15. ^ "Swift and Objective-C in the Same Project"页面存档备份,存于互联网档案馆), Apple Inc.
  16. ^ The Swift Programming Language页面存档备份,存于互联网档案馆).

外部链接