跳转到内容

Swift語言:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
G-Fly留言 | 贡献
G-Fly留言 | 贡献
第19行: 第19行:
| typing = 静态、[[強型別]]、[[类型推论]]
| typing = 静态、[[強型別]]、[[类型推论]]
| implementations =
| implementations =
| programming language = C++11
| programming_language = C++11
| dialects =
| dialects =
| influenced_by = [[Objective-C]]、[[Rust]]、[[Haskell]]、[[Ruby]]、[[Python]]、[[C Sharp|C#]]、{{le|CLU|CLU (programming language)}}<ref name="lattner 2014 info 1">{{cite web|url=http://nondot.org/sabre|title=Chris Lattner's Homepage|publisher=Chris Lattner|first=Chris|last=Lattner|authorlink=Chris Lattner|date=June 3, 2014|accessdate=June 3, 2014|quote=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.}}</ref>,和[[D语言]]<ref name="swift blog">{{cite web|title=Building assert() in Swift, Part 2: __FILE__ and __LINE__ - Swift Blog -|url=https://developer.apple.com/swift/blog/?id=15|publisher=Apple Developer|accessdate=26 September 2014 | quote=Swift borrows a clever feature from the [[D语言|D language]]: these identifiers expand to the location of the caller when evaluated in a default argument list.}}</ref>
| influenced_by = [[Objective-C]]、[[Rust]]、[[Haskell]]、[[Ruby]]、[[Python]]、[[C Sharp|C#]]、{{le|CLU|CLU (programming language)}}<ref name="lattner 2014 info 1">{{cite web|url=http://nondot.org/sabre|title=Chris Lattner's Homepage|publisher=Chris Lattner|first=Chris|last=Lattner|authorlink=Chris Lattner|date=June 3, 2014|accessdate=June 3, 2014|quote=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.}}</ref>,和[[D语言]]<ref name="swift blog">{{cite web|title=Building assert() in Swift, Part 2: __FILE__ and __LINE__ - Swift Blog -|url=https://developer.apple.com/swift/blog/?id=15|publisher=Apple Developer|accessdate=26 September 2014 | quote=Swift borrows a clever feature from the [[D语言|D language]]: these identifiers expand to the location of the caller when evaluated in a default argument list.}}</ref>

2016年7月7日 (四) 08:59的版本

Swift
File:Apple-swift-logo.png
编程范型范式物件導向泛函指令式组块英语Block_(programming)结构化
設計者克里斯·拉特納Apple
實作者Apple
发行时间2014
当前版本
  • 6.0.2(2024年10月28日;穩定版本)[1]
編輯維基數據鏈接
型態系統静态、強型別类型推论
實作語言C++11
操作系统OS X, iOS
許可證開放[2]
文件扩展名.swift
網站官方网站
啟發語言
Objective-CRustHaskellRubyPythonC#CLU[3],和D语言[4]

Swift是一種支持多编程范式編譯式的編程語言,是用來撰寫OS XiOSWatch OS的语言之一[7]。 2014年,其在苹果开发者年会(WWDC)發布。設計Swift時,蘋果公司有意讓Swift與Objective-C共存在蘋果公司的作業系統[7]

歷史

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可以推斷變數型別(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"

[13]

過去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编程具有類似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 與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("\(名字)是\(歲) 歲。")
}

相關條目

參考資料

  1. ^ Release 6.0.2. 2024年10月28日 [2024年12月1日]. 
  2. ^ "Apple will open-source its Swift programming language"
  3. ^ 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. 
  4. ^ 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. 
  5. ^ https://swift.org/download/#releases
  6. ^ https://swift.org/download/#previews
  7. ^ 7.0 7.1 Apple announces Swift, a new programming language for iOS. 
  8. ^ 苹果新编程语言Swift仅耗时4年完成开发
  9. ^ "Swift 2.0"
  10. ^ [1]
  11. ^ [2]
  12. ^ Weber, Harrison. Apple announces ‘Swift,’ a new programming language for OS X & iOS. VentureBeat. June 2, 2014. 
  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. ^ 范凯robbin
  17. ^ The Swift Programming Language.