天天看點

來自蘋果的程式設計語言——Swift簡介【整理】

2014年06月03日淩晨,Apple剛剛釋出了Swift程式設計語言,本文從其釋出的書籍《The Swift Programming Language》中摘錄和提取而成。希望對各位的iOS&OSX開發有所幫助。

前言

在這裡我認為有必要提一下Brec Victor的Inventing on Principle,Swift程式設計環境的大部分概念都源自于Brec這個演講。

接下來進入正題。

Swift是蘋果于WWDC 2014釋出的程式設計語言,這裡引用The Swift Programming Language的原話:

Swift is a new programming language for iOS and OS X apps that builds on the best of C and Objective-C, without the constraints of C compatibility.

Swift adopts safe programming patterns and adds modern features to make programming easier, more flexible and more fun.

Swift’s clean slate, backed by the mature and much-loved Cocoa and Cocoa Touch frameworks, is an opportunity to imagine how software development works.

Swift is the first industrial-quality systems programming language that is as expressive and enjoyable as a scripting language.

簡單的說:

Swift用來寫iOS和OS X程式。(估計也不會支援其它屌絲系統)

Swift吸取了C和Objective-C的優點,且更加強大易用。

Swift可以使用現有的Cocoa和Cocoa Touch架構。

Swift兼具編譯語言的高性能(Performance)和腳本語言的互動性(Interactive)。

基本概念

注:這一節的代碼源自The Swift Programming Language中的A Swift Tour。

Hello, world

類似于腳本語言,下面的代碼即是一個完整的Swift程式。

println("Hello, world")

變量與常量

Swift使用var聲明變量,let聲明常量。

類型推導

Swift支援類型推導(Type Inference),是以上面的代碼不需指定類型,如果需要指定類型:

Swift不支援隐式類型轉換(Implicitly casting),是以下面的代碼需要顯式類型轉換(Explicitly casting):

字元串格式化

Swift使用\(item)的形式進行字元串格式化:

數組和字典

Swift使用[]操作符聲明數組(array)和字典(dictionary):

一般使用初始化器(initializer)文法建立空數組和空字典:

如果類型資訊已知,則可以使用[]聲明空數組,使用[:]聲明空字典。

概覽

Swift的條件語句包含if和switch,循環語句包含for-in、for、while和do-while,循環/判斷條件不需要括号,但循環/判斷體(body)必需括号:

可空類型

結合if和let,可以友善的處理可空變量(nullable variable)。對于空值,需要在類型聲明後添加?顯式标明該類型可空。

靈活的switch

Swift中的switch支援各種各樣的比較操作:

其它循環

for-in除了周遊數組也可以用來周遊字典:

while循環和do-while循環:

Swift支援傳統的for循環,此外也可以通過結合..(生成一個區間)和for-in實作同樣的邏輯。

注意:Swift除了..還有...:..生成前閉後開的區間,而...生成前閉後閉的區間。

函數

Swift使用func關鍵字聲明函數:

通過元組(Tuple)傳回多個值:

支援帶有變長參數的函數:

函數也可以嵌套函數:

作為頭等對象,函數既可以作為傳回值,也可以作為參數傳遞:

閉包

本質來說,函數是特殊的閉包,Swift中可以利用{}聲明匿名閉包:

當閉包的類型已知時,可以使用下面的簡化寫法:

此外還可以通過參數的位置來使用參數,當函數最後一個參數是閉包時,可以使用下面的文法:

建立和使用類

Swift使用class建立一個類,類可以包含字段和方法:

建立Shape類的執行個體,并調用其字段和方法。

通過init建構對象,既可以使用self顯式引用成員字段(name),也可以隐式引用(numberOfSides)。

使用deinit進行清理工作。

Swift支援繼承和多态(override父類方法):

注意:如果這裡的simpleDescription方法沒有被辨別為override,則會引發編譯錯誤。

為了簡化代碼,Swift引入了屬性(property),見下面的perimeter字段:

注意:指派器(setter)中,接收的值被自動命名為newValue。

willSet和didSet

EquilateralTriangle的構造器進行了如下操作:

為子類型的屬性指派。

調用父類型的構造器。

修改父類型的屬性。

如果不需要計算屬性的值,但需要在指派前後進行一些操作的話,使用willSet和didSet:

進而保證triangle和square擁有相等的sideLength。

Swift中,函數的參數名稱隻能在函數内部使用,但方法的參數名稱除了在内部使用外還可以在外部使用(第一個參數除外),例如:

注意Swift支援為方法參數取别名:在上面的代碼裡,numberOfTimes面向外部,times面向内部。

?的另一種用途

使用可空值時,?可以出現在方法、屬性或下标前面。如果?前的值為nil,那麼?後面的表達式會被忽略,而原表達式直接傳回nil,例如:

當optionalSquare為nil時,sideLength屬性調用會被忽略。

枚舉

使用enum建立枚舉——注意Swift的枚舉可以關聯方法:

使用toRaw和fromRaw在原始(raw)數值和枚舉值之間進行轉換:

注意枚舉中的成員值(member value)是實際的值(actual value),和原始值(raw value)沒有必然關聯。

一些情況下枚舉不存在有意義的原始值,這時可以直接忽略原始值:

除了可以關聯方法,枚舉還支援在其成員上關聯值,同一枚舉的不同成員可以有不同的關聯的值:

結構

Swift使用struct關鍵字建立結構。結構支援構造器和方法這些類的特性。結構和類的最大差別在于:結構的執行個體按值傳遞(passed by value),而類的執行個體按引用傳遞(passed by reference)。

協定

Swift使用protocol定義協定:

類型、枚舉和結構都可以實作(adopt)協定:

擴充

擴充用于在已有的類型上增加新的功能(比如新的方法或屬性),Swift使用extension聲明擴充:

泛型(generics)

Swift使用<>來聲明泛型函數或泛型類型:

Swift也支援在類、枚舉和結構中使用泛型:

有時需要對泛型做一些需求(requirements),比如需求某個泛型類型實作某個接口或繼承自某個特定類型、兩個泛型類型屬于同一個類型等等,Swift通過where描述這些需求:

Swift語言概覽就到這裡,有興趣的朋友請進一步閱讀The Swift Programming Language。

接下來聊聊個人對Swift的一些感受。

注意:下面的感受純屬個人意見,僅供參考。

大雜燴

盡管我接觸Swift不足兩小時,但很容易看出Swift吸收了大量其它程式設計語言中的元素,這些元素包括但不限于:

屬性(Property)、可空值(Nullable type)文法和泛型(Generic Type)文法源自C#。

格式風格與Go相仿(沒有句末的分号,判斷條件不需要括号)。

Python風格的目前執行個體引用文法(使用self)和清單字典聲明文法。

Haskell風格的區間聲明文法(比如1..3,1...3)。

協定和擴充源自Objective-C(自家産品随便用)。

枚舉類型很像Java(可以擁有成員或方法)。

class和struct的概念和C#極其相似。

注意這裡不是說Swift是抄襲——實際上程式設計語言能玩的花樣基本就這些,況且Swift選的都是在我看來相當不錯的特性。

而且,這個大雜燴有一個好處——就是任何其它程式設計語言的開發者都不會覺得Swift很陌生——這一點很重要。

拒絕隐式(Refuse implicity)

Swift去除了一些隐式操作,比如隐式類型轉換和隐式方法重載這兩個坑,幹的漂亮。

Swift的應用方向

我認為Swift主要有下面這兩個應用方向:

教育

我指的是程式設計教育。現有程式設計語言最大的問題就是互動性奇差,進而導緻學習曲線陡峭。相信Swift及其互動性極強的程式設計環境能夠打破這個局面,讓更多的人——尤其是青少年,學會程式設計。

這裡有必要再次提到Brec Victor的Inventing on Principle,看了這個視訊你就會明白一個互動性強的程式設計環境能夠帶來什麼。

應用開發

現有的iOS和OS X應用開發均使用Objective-C,而Objective-C是一門及其繁瑣(verbose)且學習曲線比較陡峭的語言,如果Swift能夠提供一個同現有Obj-C架構的簡易互操作接口,我相信會有大量的程式員轉投Swift;與此同時,Swift簡易的文法也會帶來相當數量的其它平台開發者。

總之,上一次某家大公司大張旗鼓的推出一門程式設計語言及其程式設計平台還是在2000年(微軟推出C#),将近15年之後,蘋果推出Swift——作為開發者,我很高興能夠見證一門程式設計語言的誕生。

參照位址:http://zh.lucida.me/blog/an-introduction-to-swift/