Swift語言快速入門

weixin_34402090發表於2014-10-17

Swift語言快速入門(首部同步新版官方API文件和語法的Swift圖書,確保程式碼可編譯,作者專家線上答疑,圖書勘誤實時跟進

極客學院 編著  

ISBN 978-7-121-24328-8

2014年10月出版

定價:59.00元

428

16

編輯推薦

本書內容翔實,例項豐富,同步新版官方API文件和語法

語法|詞法|框架覆蓋全面,實戰案例|配套習題豐富

多位Swift專家聯合推薦,不僅是Swift入門書籍,也可做案頭工具書

作者攜手Swift專家線上答疑,方式如下:

1、專屬勘誤交流論壇(Swift中文幫):http://swift.muzining.com/

2、QQ群(Swift快速入門書友會):259152129

內容提要

《Swift語言快速入門》以蘋果官方Swift英文文件為基礎,以其大綱為主線,從易到難全面闡述了Swift語言的語言基礎、基本運算、字串操作、集合型別、流程控制、函式與閉包、物件導向、高階運算子操作及語法參考等方方面面。此外,《Swift語言快速入門》內容及API已與蘋果官方英文文件同步更新,減少了初學者學習舊版語言文件卻不能正常編譯程式碼的困惑。

《Swift語言快速入門》涵蓋面廣,內容全面,不僅適合於Swift語言的初學者,有一定iOS程式設計經驗的開發者可以把它當作案頭工具書。

目錄

第1章 馬斯堡遊記     1

1.1  買票        1

1.2  導遊        13

1.3  飛碟        22

1.4  鬥法        23

1.5  題詩        27

第2章 Swift初見         28

2.1  Hello World     28

2.2  簡單值   29

2.3  控制流   30

2.4  函式和閉包   33

2.5  物件和類        35

2.6  列舉和結構   39

2.7  協議和擴充套件   42

2.8  泛型        43

第3章 語法入門          45

3.1 基礎        45

3.1.1 常量和變數         45

3.1.2 註釋    48

3.1.3 分號    49

3.1.4 整數    49

3.1.5 浮點數         50

3.1.6 型別安全和型別推斷         50

3.1.7 數值字面量         51

3.1.8 數值型別轉換    52

3.1.9 型別別名    53

3.1.10 布林值         54

3.1.11 元組    55

3.1.12 可選    56

3.1.13 斷言    60

3.2 基本運算子   61

3.2.1 術語    61

3.2.2 賦值運算子         62

3.2.3 算術運算子         62

3.2.4 求餘運算子         63

3.2.5 浮點數求餘運算子    64

3.2.6 自增和自減運算子    64

3.2.7 單目負號運算子         65

3.2.8 單目正號運算子         65

3.2.9 複合賦值運算子         65

3.2.10 比較運算子         66

3.2.11 三目條件運算子         66

3.2.12  nil合併運算子 67

3.2.13 區間運算子         68

3.2.14 邏輯運算子         69

3.3  字串與字元        71

3.3.1 字串字面量    72

3.3.2 初始化空字串         73

3.3.3 字串可變性    73

3.3.4 字串是值型別         73

3.3.5 使用字元    74

3.3.6 連線字串和字元    74

3.3.7 字串插值         75

3.3.8  Unicode        75

3.3.9 計算字元數量    77

3.3.10 比較字串         78

3.4 集合型別        79

3.4.1 集合的可變性    80

3.4.2 陣列    80

3.4.3 字典    84

3.5  流程流   89

3.5.1 for迴圈       89

3.5.2 while迴圈   93

3.5.3 條件語句    96

3.5.4 控制轉移語句    103

3.6 函式        108

3.6.1 函式的定義與呼叫    108

3.6.2 函式引數和返回值    110

3.6.3 函式引數名稱    113

3.6.4 函式型別    119

3.6.5 巢狀函式    122

3.7  閉包        122

3.7.1 閉包表示式         123

3.7.2 尾隨閉包    126

3.7.3 值捕獲         128

3.7.4 閉包是引用型別         130

3.8 列舉        130

3.8.1  列舉語法    131

3.8.2 使用switch 語句匹配列舉值   132

3.8.3 關聯值         133

3.8.4 原始值         135

3.9 類和結構體   136

3.9.1 類和結構體的對比    137

3.9.2 結構體和列舉是值型別    139

3.9.3 類是引用型別    141

3.9.4 類和結構體的選擇    142

3.9.5  字串、陣列及字典的賦值和複製行為         143

第4章 初級語法          144

4.1  屬性        144

4.1.1 儲存屬性    144

4.1.2 計算屬性    147

4.1.3 屬性監察器         149

4.1.4 全域性變數和本地變數         151

4.1.5 型別屬性    151

4.2 方法        155

4.2.1 例項方法    155

4.2.2 型別方法    160

4.3 下標        163

4.3.1 下標語法    163

4.3.2 下標用法    164

4.3.3 下標選項    164

4.4 繼承        166

4.4.1 定義一個基類    167

4.4.2 子類生成    168

4.4.3 重寫    169

4.4.4 防止重寫    173

4.5 構造        173

4.5.1 儲存屬性的初始賦值         173

4.5.2 自定義構造         174

4.5.3 預設構造器         178

4.5.4 值型別的構造器代理         179

4.5.5 類的繼承和構造         180

4.5.6 通過閉包或函式來設定屬性的預設值    190

4.6 析構        192

4.6.1 析構原理    192

4.6.2 析構例項    192

4.7 自動引用計數        194

4.7.1 ARC的工作原理         195

4.7.2 ARC實踐     195

4.7.3 類例項間的強引用環         196

4.7.4 解決類例項間的強引用環         199

4.7.5 閉包產生的強引用環         205

4.7.6 解決閉包產生的強引用環         207

4.8 可選鏈   210

4.8.1 可選鏈替代可選強制解析         210

4.8.2 為可選鏈定義模型類         211

4.8.3 通過可選鏈獲取屬性         213

4.8.4 通過可選鏈呼叫方法         214

4.8.5 使用可選鏈獲取下標         214

4.8.6 連線多層鏈         215

4.8.7 可選鏈中返回可選型別的方法         216

4.9 型別轉換        217

4.9.1 定義一個類層次作為例子         217

4.9.2 型別檢查    218

4.9.3 向下轉換    219

4.9.4 Any和AnyObject的轉換   220

4.10 型別巢狀        222

4.10.1 型別巢狀實踐    223

4.10.2 引用巢狀型別    224

第5章 高階語法          225

5.1 擴充套件        225

5.1.1 擴充套件語法    225

5.1.2 計算屬性    226

5.1.3 構造器         227

5.1.4 方法    228

5.1.5 可變例項方法    229

5.1.6 下標    229

5.1.7 巢狀型別    230

5.2 協議        231

5.2.1 協議語法    231

5.2.2 屬性要求    232

5.2.3 方法要求    233

5.2.4 可變方法要求    234

5.2.5 協議作為型別    235

5.2.6 集合中的協議型別    240

5.2.7 協議的繼承         241

5.2.8 協議合成    242

5.2.9 檢查協議的一致性    243

5.2.10 可選協議要求    245

5.3  泛型        247

5.3.1 泛型解決的問題         247

5.3.2 泛型函式    248

5.3.3 型別引數    249

5.3.4 命名型別引數    249

5.3.5 泛型型別    250

5.3.6  擴充套件泛型型別    252

5.3.7 型別約束    253

5.3.8 關聯型別    256

5.3.9  where子句 258

5.4  訪問控制        260

5.4.1  模組和原始檔    261

5.4.2  訪問級別    261

5.4.3  訪問控制語法    262

5.4.4  自定義型別         263

5.4.5  子類    265

5.4.6  常量、變數、屬性和下標         266

5.4.7  協議    268

5.4.8  擴充套件    269

5.5  高階運算子   269

5.5.1  位運算子    270

5.5.2  溢位運算子         274

5.5.3  優先順序和結合性         276

5.5.4  運算子函式         277

5.5.5  前置和後置運算子    278

5.5.6  組合賦值運算子         279

5.5.7  比較運算子         280

5.5.8  自定義運算子    280

5.5.9  自定義中置運算子的優先順序和結合性    281

第6章 詞法參考          282

6.1  關於詞法參考        282

6.2  詞法結構        283

6.2.1  空白與註釋         283

6.2.2  識別符號         283

6.2.3  關鍵字和標點符號    285

6.2.4  字面量         286

6.2.5  運算子         290

6.3  型別        292

6.3.1  型別標註    292

6.3.2  型別識別符號         293

6.3.3  元組型別    293

6.3.4  函式型別    294

6.3.5  陣列型別    295

6.3.6  字典型別    296

6.3.7  可選型別    296

6.3.8  隱式解析可選型別    297

6.3.9  合成協議    298

6.3.10 元型別         298

6.3.11 型別繼承語法    299

6.3.12 型別推斷    299

6.4  表示式   300

6.4.1  字首表示式         300

6.4.2  二元表示式         301

6.4.3  賦值表示式         303

6.4.4  三元條件運算子         303

6.4.5  型別轉換運算子         304

6.4.6  主表示式    305

6.4.7  字尾表示式         310

6.5  語句        314

6.5.1  迴圈語句    315

6.5.2  分支語句    317

6.5.3  帶標籤的語句    320

6.5.4  控制傳遞語句    321

6.6  宣告        322

6.6.1  全域性程式碼    323

6.6.2  程式碼塊         323

6.6.3  匯入宣告    324

6.6.4  常量宣告    324

6.6.5  變數宣告    325

6.6.6  類和靜態變數屬性    327

6.6.7  型別別名    328

6.6.8  函式宣告    328

6.6.9  列舉宣告    332

6.6.10 結構體宣告         334

6.6.11 類宣告         335

6.6.12 協議宣告    336

6.6.13 協議構造器宣告         338

6.6.14 協議下標宣告    338

6.6.15 協議相關型別宣告    338

6.6.16 構造器宣告         339

6.6.17 析構器宣告         340

6.6.18 擴充套件宣告    340

6.6.19 下標宣告    341

6.6.20 運算子宣告         342

6.6.21 特徵宣告修飾符         343

6.6.22 訪問控制級別    344

6.7  特徵        345

6.7.1  宣告特徵    345

6.7.2  Interface Builder使用的宣告特徵    348

6.7.3  型別特徵    348

6.8  模式        349

6.8.1  萬用字元模式         349

6.8.2  識別符號模式         350

6.8.3  值繫結模式         350

6.8.4  元組模式    350

6.8.5  列舉用例模式    351

6.8.6  型別轉換模式    352

6.8.7  表示式模式         352

6.9  泛型形參和實參   353

6.9.1  泛型形參子句    353

6.9.2  where 子句         354

6.9.3  泛型引數子句    355

6.10 語法總結        356

6.10.1  語句(Statements)        356

6.10.2  泛型形參與實參(Generic Parameter and Arguments)      358

6.10.3  宣告(Declarations)      358

6.10.4  模式(Patterns)    364

6.10.5  特徵(Attributes) 365

6.10.6  表示式(Expression)     365

6.10.7  詞法結構(Lexical Structure)        368

6.10.8  型別(Types) 372

第7章 使用Cocoa框架與ObjC         374

7.1  基本設定        374

7.1.1  建立你的Swift環境  374

7.1.2  理解Swift的匯入過程       375

7.2  與ObjC API互動    376

7.2.1  初始化         376

7.2.2  訪問屬性    377

7.2.3  使用方法    377

7.2.4  id相容性     378

7.2.5  使用nil        379

7.2.6  擴充套件    380

7.2.7  閉包    381

7.2.8  物件比較    381

7.2.9  Swift型別相容性        381

7.2.10  Objective-C選擇器   382

7.3  以ObjC的行為寫Swift 383

7.3.1  繼承Objective-C的類         383

7.3.2  適配協議    384

7.3.3  編寫構造器和析構器         384

7.3.4  整合Interface Builder         384

7.3.5  指明屬性特性    386

7.3.6  實現核心資料管理物件的子類         386

7.4  使用Cocoa資料型別    386

7.4.1  字串         387

7.4.2  數字    387

7.4.3  集合類         388

7.4.4  Foundation資料型別 390

7.4.5  Foundation函式 390

7.4.6  Core Foundation 390

7.5  採用Cocoa設計模式    392

7.5.1  委託    392

7.5.2  錯誤報告    392

7.5.3  鍵值觀察    393

7.5.4  Target-Action       394

7.5.5  內省    394

7.6  與C API互動 395

7.6.1  基本型別    395

7.6.2  列舉    396

7.6.3  指標    397

7.6.4  全域性常量    401

7.6.5  預處理指令         401

7.7  與ObjC混編  402

7.7.1  混編概述    402

7.7.2  在同一個app target中進行程式碼匯入      403

7.7.3  在同一個framework target中匯入程式碼 404

7.7.4  匯入外部框架    405

7.7.5  在Objective-C中使用Swift程式碼       406

7.7.6  product模式命名       407

7.7.7  故障排除和提醒         407

7.8  遷移ObjC程式碼至Swift 408

7.8.1  為你的Objective-C程式碼遷移做好準備    408

7.8.2  遷移過程    408

7.8.3  技巧和提示         409

作者簡介

陳少佳,現任極客學院佈道師,負責教師團隊建設、線上課程建設等工作。

2008年從業至今,曾任外企技術總監、線下培訓機構學術總監、副校長,培養過至少1000名月薪過萬的Android、iOS開發工程師。

李藝(網名:蝸牛君),蘇州人士,清華計算機碩士,極客學院Swift專家,木子寧工作室掌門。Adobe中國首批社群幫助管理員與版主,著名iOS獨立遊戲開發者,愛好書法、簫、吉他等,喜好郊遊,偶爾會做義工。

部落格地址:www.muzining.com

微博:weibo.com/angrymarble

媒體評論

Swift在保證效能的同時整合了很多現代的程式設計特性,對OS X和iOS開發者來說是重大的改進,也是以後的趨勢。本書很好地講解了Swift入門學習中各種例項、解決方案並配以詳盡的語言文件,是開發者學習Swift的必備書籍!

——馮斌 正點科技技術總監

移動網際網路時代,技術更新異常頻繁。僅守住所謂的紮實的“基本功”已跟不上時代的潮流,必須時刻緊跟最新技術。極客學院緊抓技術熱點,並在第一時間將其奉獻給讀者,不管是網路課程模式還是書籍形式,都是既追求實效性,又追求深度,真是讀者的福音。

——毛曉冬 高通中國資深研發經理

極客學院的創業者們在國內移動端開發技術領域經營多年,積累非常深厚,致力於技術的交流和傳承,培養出了不少優秀的工程師。相信這本書同樣不會辜負各位開發者的期望,值得大家期待!

——王鵬雲 多盟技術副總裁

想學好一門程式語言要從選好書開始!極客學院編著的好書值得您即刻購買!

——謝耀輝 活動行聯合創始人

Swift會真正改變iOS開發生態,現在大家在同一個起跑線上,立即出發,開啟Swift技術之旅吧。

——iceskysl 極客學院&eoe 聯合創始人

前言

Swift體會

極客學院首席講師 陳劭家(ime)

 

 

我不算是一個果粉,但是我很喜歡蘋果的產品,甚至可以說是狂熱。2014年6月2日晚上我一夜未眠,就是在等蘋果的WWDC,這是開發者的狂歡之夜(或者狂歡之日,因為美國時間是白天)。凌晨1點,終於開始了,但是蘋果一次又一次的新產品展示讓我一次又一次的失望,作為開發者的我表示無感。

我堅持看因為我不相信蘋果總是讓我失望。最終在WWDC的最後一個環節,我真心沸騰了,因為一門新的程式語言——Swift出現了。要知道在飽受了Objective-C語言之苦後看見Swift是一種什麼心情,你不需要再為引用計數而頭疼,不需要再為沒有名稱空間而不得不新增該死的字首而煩惱,不需要再為Objective-C那難懂的語法而整天暈乎乎的。此外,蘋果還為我們提供了Playground這個工具,它能夠在我們寫程式時實時計算出變數的值,甚至還能呈現數字變數的趨勢圖,讓程式設計富有樂趣及創造性。

由於Swift出現得晚,所以它擁有了目前世界上幾乎所有程式語言的優點,而沒有目前所有程式語言的缺點,Swift真的太漂亮了。下面我們開始一步一步認識它。

執行速度

從蘋果官方給出的資料來看,Objective-C比Python快2.8倍,而Swift比Python快3.9倍,可見蘋果在Swift上下了大量的工夫進行優化。

開發環境

Swift語言的開發環境是蘋果公司提供的整合開發環境Xcode,可以用來開發iOS應用、iOS遊戲、OS X窗體程式、OS X遊戲、OS X命令列程式,讀者可以直接從App Store中搜尋並下載。用Swift語言可以做到幾乎所有Objective-C所能做到的事情,所以Swift必將取代Objective-C,如果你還沒有學過Objective-C語言,那麼恭喜你,不用學了,直接學習Swift即可。

執行環境

Swift被強大的llvm編譯成機器碼,直接執行在系統中。由於Swift是蘋果的產品,所以目前只支援蘋果的系統(OS X和iOS)。我們期待會有社群開發出跨平臺的Swift語言,因為這麼好的一門程式語言,應該能夠讓世界上的每一個人享受到才好,就像mono讓C#語言跨平臺一樣。

語言特性

具有所有現代程式語言的特性,包括:物件導向、類擴充套件、名稱空間、閉包、泛型、強型別、函式有多個返回值等。

這些特效能夠大大提高程式設計師的開發效率,從而為企業節約成本,同時讓程式設計工作充滿樂趣。

語法簡介

通過前文的介紹,相信讀者已經迫不及待地想嘗試使用Swift了,下面我們就來認識一下Swift的語法。

簡潔的語法

Swift拋棄了Objective-C那種古板難懂的語法,採用通俗易懂的指令碼語言類語法,學過Python、JavaScript或者Lua語言的讀者肯定不會陌生,這大大降低了初學者的學習成本。

變數及常量

如果要定義一個變數i等於1,只需要寫var i = 1,可以看出,不需要指定型別,因為Swift會自動做型別推斷。

如果要定義一個常量PI等於3.14,只需要寫let PI = 3.14,常量只能被賦值一次。

輸出語句

在Swift中,可以直接使用println函式來輸出一段任意型別的資訊,如下所示:

println("Hello Swift")

字串連線

Swift語言中的字串連線同樣也非常簡單,如果兩個值都是字串,則可直接用加號連線,如下所示:

var hello = "Hello"

var world = "World"

var str = hello + world

 

如果將要連線的值中有其他型別,則直接使用\()包括就可進行連線,如下所示:

var hello = "Hello"

var num = 100

var str = "\(hello) \(num)"

 

從上面的示例可以看出,相比Objective-C或者C/C++語言來說,簡單太多了。

迴圈

傳統的C語言中的for迴圈是這麼寫的:

for (int i = 0; i < 100; i++) {

    //TODO

}

 

在Swift中,將迴圈大大簡化了,如下所示:

for i in 0..<100{

    //TODO

}

 

具體內容還有很多,詳見本書正文。

條件判斷

條件判斷與C語言並沒有區別,可以直接書寫C語言的語法即可通過,如下所示:

if (count>5) {

    //TODO

}

 

在Swift中還可以再簡潔一些,如下:

if count>5 {

    //TODO

}

 

另外,在Swift語言中,switch…case語句可以不用加break關鍵字。

函式

如果要定義一個函式用來輸出一段資訊,則程式碼如下所示:

func sayHello(){

    println("Hello Swift")

}

 

這種寫法非常簡潔,我曾在Dart語言中見過這種寫法,func是一個關鍵字,用來指明所定義的是一個函式,sayHello是函式名稱,()中是該函式的傳入引數。如果還想使用傳入引數及返回值,如下所示:

func max(a:Int,b:Int)->Int{

    if a>b {

        return a

    }else{

        return b

    }

}

 

該函式名稱為max,可傳入兩個引數,都是整數型別,引數名稱分別為a、b,函式的返回值也是整數型別。

Swift中的函式還可以同時返回多個值,如下所示:

func getNum()->(Int,Int){

    return (3,4)

}

 

如果想對該函式進行呼叫並獲取到這兩個返回結果值,則用法如下:

let (a,b) = getNum()

物件導向

類的定義非常簡單,如下所示:

class Hello{

    func sayHello(){

        println("Hello Swift")

    }

}

 

該示例定義了一個名為Hello的類,其有一個成員函式名為sayHello,如果想呼叫該類及相應函式,則用法如下:

var h = Hello()

h.sayHello()

 

類的繼承的寫法也非常簡單,這一點繼承了C++語言的優秀傳統,如果想定義一個名為Hi的類繼承自Hello,則寫法如下:

class Hi:Hello{

}

 

如果後期還想為某類新增功能,有兩種方法。第一種是直接修改類的原始碼新增功能,第二種是為該類寫擴充套件功能,下面我們來著重介紹第二種。如果想為Hello類再新增一個名為sayHi的方法,則程式碼如下所示:

extension Hello{

    func sayHi(){

        println("Hi Swift")

    }

}

 

其中,extension關鍵字表示要擴充套件已經存在的類的功能,如果想擴充套件系統或者第三方的某個類的功能而得不到其原始碼時,採用這種方式將會是一個絕佳的選擇。如下所示:

extension String{

    func printSelf(){

        println(self)

    }

}

var str = "Hello Swift"

str.printSelf()

 

通過這種方式擴充套件了系統的String類,為其增加了一個printSelf()方法,在使用時可直接呼叫目標物件的printSelf()方法,非常方便。

關於物件導向的更多特性,請看本書正文。

其實extension還有另一個用途,那就是模擬名稱空間,請看下一個主題。

名稱空間

在Swift語言中並沒有專門的名稱空間的關鍵字,但是可以模擬名稱空間這個物件導向的特性,如下所示:

//定義名稱空間ime

class ime{

}

 

//在ime名稱空間下定義Hello類

extension ime{

    class Hello{

        func sayHello(){

            println("Hello Swift")

        }

    }

}

 

使用該類及相關方法的程式碼如下所示:

var h = ime.Hello()

h.sayHello()

 

有沒有讓你眼前一亮的感覺呢?

結尾

就寫到這裡吧,想必大家已經對Swift有了一個初步的瞭解,而且迫不及待地想開始學習了,努力吧,少年,你就是未來的太陽!

 

相關文章