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.1for循環 89
3.5.2while循環 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.1ARC的工作原理 195
4.7.2ARC實踐 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.4Any和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在保證性能的同時整合了很多現代的程式設計特性,對OSX和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 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{
具體内容還有很多,詳見本書正文。
條件判斷
條件判斷與C語言并沒有差別,可以直接書寫C語言的文法即可通過,如下所示:
if (count>5) {
在Swift中還可以再簡潔一些,如下:
if count>5 {
另外,在Swift語言中,switch…case語句可以不用加break關鍵字。
函數
如果要定義一個函數用來輸出一段資訊,則代碼如下所示:
func sayHello(){
println("HelloSwift")
這種寫法非常簡潔,我曾在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("HelloSwift")
該示例定義了一個名為Hello的類,其有一個成員函數名為sayHello,如果想調用該類及相應函數,則用法如下:
var h = Hello()
h.sayHello()
類的繼承的寫法也非常簡單,這一點繼承了C++語言的優秀傳統,如果想定義一個名為Hi的類繼承自Hello,則寫法如下:
class Hi:Hello{
如果後期還想為某類添加功能,有兩種方法。第一種是直接修改類的源碼添加功能,第二種是為該類寫擴充功能,下面我們來着重介紹第二種。如果想為Hello類再添加一個名為sayHi的方法,則代碼如下所示:
extension Hello{
func sayHi(){
println("HiSwift")
其中,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()
有沒有讓你眼前一亮的感覺呢?
結尾
就寫到這裡吧,想必大家已經對Swift有了一個初步的了解,而且迫不及待地想開始學習了,努力吧,少年,你就是未來的太陽!
