Swift語言快速入門

Swift語言快速入門

《Swift語言快速入門》是2014年10月電子工業出版社出版的圖書,作者是極客學院。

內容簡介

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

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

編輯推薦

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

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

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

內容提要

《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獨立遊戲開發者,愛好書法、簫、吉他等,喜好郊遊,偶爾會做義工。

媒體評論

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有了一個初步的了解,而且迫不及待地想開始學習了,努力吧,少年,你就是未來的太陽!


相關詞條

熱門詞條

聯絡我們