Swift语言
File:Apple-swift-logo.png | |
编程范型 | 多范式(面向对象、泛函、指令式、组块结构化) |
---|---|
设计者 | 克里斯·拉特纳与Apple |
实现者 | Apple |
发行时间 | 2014 |
当前版本 |
|
类型系统 | 静态、强类型、类型推论 |
操作系统 | macOS、iOS、watchOS和tvOS |
许可证 | 开放[2] |
文件扩展名 | .swift |
网站 | 官方网站 |
启发语言 | |
Objective-C、Rust、Haskell、Ruby、Python、C#、CLU[3],和D语言[4] |
Swift是一种支持多编程范式和编译式的编程语言,是用来撰写macOS/OS X、iOS、watch OS和tvOS的语言之一[7]。 2014年,其在苹果开发者年会(WWDC)发布。设计Swift时,苹果公司有意让Swift与Objective-C共存在苹果公司的操作系统上[7]。
历史
2010年7月,苹果开发者工具部门总监克里斯·拉特纳开始着手 Swift 编程语言的设计工作,以一年时间,完成基本架构后,他领导了一个设计团队大力参与其中。Swift大约历经4年的开发期,2014年6月发表。
苹果宣称Swift的特点是:快速、现代、安全、互动,而且明显优于Objective-C语言。Swift以LLVM编译,可以使用现有的Cocoa和Cocoa 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可以推断变量类型(var, variant)。同时,它提供了类似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 提供了语法糖(syntactic sugar)的方式让这些对象可以集成在同一个语言里。例如NSString之间合并的表示法如下:
NSString *str = @"hello,"; str = [str stringByAppendingString:@" world"];
在Swift里, 字符串的累积可以用加法(+
)操作数作为第一级公民(First-class citizen)的方式直接完成, 上述的例子可以简化为
var str = "hello,"; str += " world"
过去Cocoa(以及Cocoa Touch)的架构总是被分成两种版本,一种是可变的(mutable),也就是可以在执行时期(runtime)改变;另一种是不可变的(immutable),其初始值不可改变,例如NSArray与NSMutableArray就是数组的两种版本。在Swift语言的世界里仍延续这个传统,但更简化为使用 let 关键字去设置常量(constant variable)。至于可变的(Mutable)对象则使用 var 关键字。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 平台可以和Object-C使用相同的执行时期(runtime)。这意味着Swift 程序可以执行于目前已存在的平台之上,包含 iOS 6 和 OS X 10.8 都可以执行Swift的程序.[14] 更重要的, Swift 和 Obj-C 的代码可并存于单一程序内, 这种延伸就如同C 和 C++ 的关系一样。
为了争取大量的开发人员并重复使用已存在的代码,Xcode 6 允许在app target导入Objective-C文件供给Swift使用,透过Objective-C的桥接头文件(bridging header)来暴露给 Swift。当开发人员添加 Swift 文件到现有的Objective-C应用程序时,Xcode 会自动创建这些头文件。例如, 一个Swift 知名的类别 "MyClass" 可用于 Obj-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编程具有类似Python与Ruby交互性接口(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
与Ojbective-C都十分类似, 但有延伸功能, 像是for in
用于集合(collection)的轮询,switch
还可以接受非整数的cases条件值, 诸如此类。
不同于 Objective-C之处
- 陈述句(statement)不须再使用分号(
;
)做为结束,但分号还是可以在一行以内作为两个以上陈述的分隔。 - 头文件(Header files)不再需要。
- 注解方式 /* ... */ 可以为嵌套(nested)注解,意思是指注解内可以再有注解,过去有些C或C++编译器不支持嵌套注解。
- 强类型(strong type)
- 类型推论或隐含类型(Type inference)
- 支持泛型编程。
- 函数为第一等类型(first-class object),这意味着函数可以作为其他函数的参数与返回值。
- 操作数可在类别内重新定义 (操作数重载),可以生成新的操作数。
- 字符串全方面支持 Unicode,某些字符甚至可以成为语言的名称。
- 许多C语言家族过去恶名昭彰的怪语法(error-prone behaviors)也被改变:
- 不再存在指针。
- 指派(Assignments)不再回传值,正确写法是
if (i==0)
,一般容易误写成if (i=0)
会造成编译时期错误(compile-time error)。 - 在
switch
的区块内不需要再使用break
叙述句。另外,case后面都需要有可执行的代码(C或C++可连续使用多个case而不需要额外的代码),否则会发生编译错误。 - 变量和常量都要被初始化,而且数组(array)的界限也要确认清楚。
- 溢出(overflows)的问题。C语言没有强制整数类型(signed integers)的界限,常常在执行时间发生问题。Swift可以透过整数类型的max或min属性获取最大值或最小值。
讨论
JavaEye的创始人Robbin发表意见:“对程序员来说,熟悉Swift语法也不过一天时间足够了。关键是要提供高级数据类型,简化Cocoa类库,否则用不用Swift都没区别。”[16]
长达600多页的 The Swift Programming Language 可以在iBooks免费下载。[17]
示例程序
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 人 {
println("\(名字)是\(歲) 歲。")
}
相关条目
参考资料
- ^ Release 6.0.2. 2024年10月28日 [2024年12月1日].
- ^ "Apple will open-source its Swift programming language"
- ^ Lattner, Chris. Chris Lattner's Homepage. Chris Lattner. June 3, 2014 [June 3, 2014].
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.
- ^ Building assert() in Swift, Part 2: __FILE__ and __LINE__ - Swift Blog -. Apple Developer. [26 September 2014].
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.
- ^ https://swift.org/download/#releases
- ^ https://swift.org/download/#previews
- ^ 7.0 7.1 Apple announces Swift, a new programming language for iOS.
- ^ 苹果新编程语言Swift仅耗时4年完成开发
- ^ "Swift 2.0"
- ^ [1]
- ^ [2]
- ^ Weber, Harrison. Apple announces ‘Swift,’ a new programming language for OS X & iOS. VentureBeat. June 2, 2014.
- ^ "Strings and Characters", Apple Inc.
- ^ "Do Swift-based apps work on OS X 10.9/iOS 7 and lower?", StackOverflow
- ^ "Swift and Objective-C in the Same Project", Apple Inc.
- ^ 范凯robbin
- ^ The Swift Programming Language.