Swift語言
Swift編程語言,支持多编程范式和編譯式,用来撰写基于macOS/OS X、iOS、iPadOS、watchOS和tvOS的软件[7]。 苹果公司于2014年在苹果开发者年会(WWDC)發布了Swift编程语言。从设计上苹果公司让Swift与Objective-C共存在苹果公司的操作系统上[7]。
![]() | |
编程范型 | 多範式(物件導向、泛函、指令式、組塊結構化) |
---|---|
設計者 | 克里斯·拉特納與蘋果公司 |
實作者 | 蘋果公司 |
发行时间 | 2014年6月2日[1] |
目前版本 |
![]() |
型態系統 | 靜態、強型別、類型推論 |
操作系统 | 蘋果公司的操作系統(Darwin, iOS, iPadOS, macOS, tvOS, watchOS), Linux, Windows 10, Android |
許可證 | Apache許可證2.0(Swift 2.2及以後版本) 專有(直到Swift 2.2)[3][4] |
文件扩展名 | .swift |
網站 | |
啟發語言 | |
Objective-C、Rust、Haskell、Ruby、Python、C#、CLU[5],和D語言[6] |
歷史编辑
2010年7月,苹果开发者工具部门总监克里斯·拉特納开始着手 Swift 编程语言的設計工作,以一年時間,完成基本架構後,他領導了一個設計團隊參與其中。Swift大約歷經4年的開發期,2014年6月發表。
苹果宣称Swift的特点是:快速、现代、安全、互动,而且明顯優於Objective-C语言。Swift以LLVM編譯,可以使用现有的Cocoa和Cocoa Touch框架。Xcode Playgrounds功能是Swift为苹果开发工具带来的最大创新,该功能提供強大的互动效果,能让Swift源代碼在撰寫过程中能即時显示出其執行結果。拉特纳本人强调,Playgrounds很大程度是受到布雷特·维克多理念的启发。[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"
過去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编程具有类似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
與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属性获取最大值或最小值。
讨论编辑
范例代码编辑
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("\(名字)是\(歲) 歲。")
}
相关条目编辑
参考资料编辑
- ^ Swift Has Reached 1.0. Apple. September 9, 2014 [March 8, 2015]. (原始内容存档于2016-07-11).
- ^ 2.0 2.1 Release 5.8. 2023年3月30日 [2023年4月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.
- ^ 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.
- ^ 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.
- ^ 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.0 7.1 Apple announces Swift, a new programming language for iOS. (原始内容存档于2015-12-26).
- ^ 苹果新编程语言Swift仅耗时4年完成开发. 网易科技报道. 2014-06-05. (原始内容存档于2014-06-08).
- ^ Swift 2.0 - Swift Blog. developer.apple.com. [2019-06-12]. (原始内容存档于2019-06-06) (美国英语).
- ^ 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)
- ^ Inc, Apple. Swift.org. Swift.org. [2019-06-12]. (原始内容存档于2019-06-15) (英语).
- ^ Weber, Harrison. Apple announces ‘Swift,’ a new programming language for OS X & iOS. VentureBeat. 2014-06-02 [2014-06-10]. (原始内容存档于2016-11-17).
- ^ "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.
- ^ The Swift Programming Language (页面存档备份,存于互联网档案馆).
外部链接编辑