Swift語言

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

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代码能在同一个程序中运行。

版本历史
特色
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"

過去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或更高的版本。 更重要的, 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使用自动引用计数(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语言

参考资料
外部链接
*

*[https://iosexample.com iOS Example]
*

  • The Swift Programming Language

评论 (0)

  • 还没有评论,来抢沙发吧。