第一部分 Swift语法篇
第1章 准备起航 2
1.1 本书约定 2
1.1.1 示例代码约定 2
1.1.2 图示约定 3
1.1.3 函数和方法签名约定 5
1.1.4 承接上一行代码约定 6
1.1.5 代码行号约定 6
1.2 Swift开发工具 7
1.2.1 Xcode开发工具 7
1.2.2 AppCode开发工具 13
1.3 本章小结 14
1.4 同步练习 14
第2章 第一个Swift程序 15
2.1 使用REPL 15
2.1.1 启动Swift REPL 15
2.1.2 使用Swift REPL 17
2.2 使用Playground 18
2.2.1 编程利器Playground 18
2.2.2 编写HelloWorld程序 19
2.3 通过Xcode创建macOS工程 23
2.3.1 创建macOS工程 23
2.3.2 编译和运行 25
2.4 使用swiftc命令 26
2.4.1 编译 26
2.4.2 运行 27
2.5 代码解释 27
2.6 本章小结 29
2.7 同步练习 29
第3章 Swift语法基础 30
3.1 标识符和关键字 30
3.1.1 标识符 30
3.1.2 关键字 31
3.2 常量和变量 33
3.2.1 常量 33
3.2.2 变量 33
3.2.3 使用var还是let 34
3.3 注释 35
3.4 表达式 36
3.5 本章小结 37
3.6 同步练习 37
第4章 运算符 39
4.1 算术运算符 39
4.1.1 一元运算符 39
4.1.2 二元运算符 40
4.1.3 算术赋值运算符 41
4.2 关系运算符 42
4.3 逻辑运算符 44
4.4 位运算符 44
4.5 其他运算符 47
4.6 本章小结 47
4.7 同步练习 48
第5章 Swift原生数据类型 50
5.1 Swift数据类型 50
5.2 整型 50
5.3 浮点型 52
5.4 数字表示方式 52
5.4.1 进制数字表示 53
5.4.2 指数表示 53
5.4.3 其他表示 53
5.5 数字类型之间的转换 54
5.5.1 整型之间的转换 54
5.5.2 整型与浮点型之间的转换 55
5.6 布尔型 55
5.7 元组类型 56
5.8 可选类型 57
5.8.1 可选类型概念 57
5.8.2 可选类型值拆包 58
5.8.3 可选绑定 59
5.9 本章小结 59
5.10 同步练习 59
第6章 Swift简介 61
6.1 字符 61
6.1.1 Unicode编码 61
6.1.2 转义符 62
6.2 创建字符串 63
6.3 可变字符串 64
6.3.1 字符串拼接 64
6.3.2 字符串插入、删除和替换 65
6.4 字符串比较 66
6.4.1 大小和相等比较 66
6.4.2 前缀和后缀比较 68
6.5 本章小结 68
6.6 同步练习 69
第7章 控制语句 70
7.1 分支语句 70
7.1.1 if语句 70
7.1.2 switch语句 72
7.1.3 guard语句 74
7.2 循环语句 77
7.2.1 while语句 77
7.2.2 repeat-while语句 78
7.2.3 for语句 79
7.3 跳转语句 80
7.3.1 break语句 80
7.3.2 continue语句 82
7.3.3 fallthrough语句 83
7.4 范围与区间运算符 85
7.4.1 switch中使用区间运算符 86
7.4.2 for中使用区间运算符 87
7.5 值绑定 88
7.5.1 if中的值绑定 88
7.5.2 guard中的值绑定 89
7.5.3 switch中的值绑定 90
7.6 where语句 91
7.6.1 switch中使用where语句 91
7.6.2 for中使用where语句 92
7.7 本章小结 92
7.8 同步练习 92
第8章 Swift原生集合类型 97
8.1 Swift中的数组集合 97
8.1.1 数组声明和初始化 98
8.1.2 可变数组 99
8.1.3 数组遍历 100
8.2 Swift中的字典集合 101
8.2.1 字典声明与初始化 102
8.2.2 可变字典 103
8.2.3 字典遍历 104
8.3 Swift中的Set集合 105
8.3.1 Set声明和初始化 106
8.3.2 可变Set集合 107
8.3.3 Set集合遍历 108
8.3.4 Set集合运算 109
8.4 本章小结 110
8.5 同步练习 110
第9章 函数 112
9.1 定义函数 112
9.2 函数参数 113
9.2.1 使用参数标签 113
9.2.2 省略参数标签 113
9.2.3 参数默认值 114
9.2.4 可变参数 114
9.2.5 值类型参数的引用传递 115
9.3 函数返回值 116
9.3.1 无返回值函数 116
9.3.2 多返回值函数 117
9.4 函数类型 117
9.4.1 作为函数返回类型使用 118
9.4.2 作为参数类型使用 119
9.5 嵌套函数 120
9.6 本章小结 121
9.7 同步练习 121
第10章 闭包 125
10.1 回顾嵌套函数 125
10.2 闭包的概念 126
10.3 使用闭包表达式 127
10.3.1 类型推断简化 127
10.3.2 隐藏return关键字 128
10.3.3 省略参数名 128
10.3.4 使用闭包返回值 129
10.4 使用尾随闭包 130
10.5 捕获上下文中的变量和常量 131
10.6 本章小结 132
10.7 同步练习 132
第11章 Swift语言中的面向对象特性 135
11.1 面向对象概念和基本特征 135
11.2 Swift中的面向对象类型 135
11.3 枚举 136
11.3.1 成员值 136
11.3.2 原始值 138
11.3.3 相关值 140
11.4 结构体与类 141
11.4.1 类和结构体定义 141
11.4.2 再谈值类型和引用类型 142
11.4.3 引用类型的比较 144
11.4.4 运算符重载 145
11.5 类型嵌套 146
11.6 可选链 147
11.6.1 可选链的概念 148
11.6.2 使用问号 (?) 和感叹号 (!) 150
11.7 访问限定 151
11.7.1 访问范围 151
11.7.2 访问级别 152
11.7.3 使用访问级别最佳实践 154
11.8 选择类还是结构体最佳实践 157
11.8.1 类和结构体的异同 157
11.8.2 选择的原则 157
11.9 本章小结 158
11.10 同步练习 159
第12章 属性与下标 163
12.1 存储属性 163
12.1.1 存储属性概念 163
12.1.2 延迟存储属性 164
12.2 计算属性 165
12.2.1 计算属性的概念 165
12.2.2 只读计算属性 167
12.2.3 结构体和枚举中的计算属性 168
12.3 属性观察者 169
12.4 静态属性 171
12.4.1 结构体静态属性 173
12.4.2 枚举静态属性 174
12.4.3 类静态属性 175
12.5 使用下标 176
12.5.1 下标概念 176
12.5.2 示例:二维数组 176
12.6 本章小结 178
12.7 同步练习 178
第13章 方法 180
13.1 实例方法 180
13.2 可变方法 181
13.3 静态方法 182
13.3.1 结构体静态方法 183
13.3.2 枚举静态方法 183
13.3.3 类静态方法 184
13.4 本章小结 184
13.5 同步练习 185
第14章 构造与析构 186
14.1 构造函数 186
14.1.1 默认构造函数 186
14.1.2 构造函数与存储属性初始化 187
14.1.3 使用参数标签 189
14.2 构造函数重载 190
14.2.1 构造函数重载概念 190
14.2.2 结构体构造函数代理 191
14.2.3 类构造函数横向代理 192
14.3 析构函数 194
14.4 本章小结 195
14.5 同步练习 195
第15章 类继承 197
15.1 从一个示例开始 197
15.2 构造函数继承 198
15.2.1 构造函数调用规则 198
15.2.2 构造过程安全检查 200
15.2.3 构造函数继承 204
15.3 重写 206
15.3.1 重写实例属性 206
15.3.2 重写静态属性 209
15.3.3 重写实例方法 209
15.3.4 重写静态方法 211
15.3.5 下标重写 211
15.3.6 使用final关键字 213
15.4 类型检查与转换 214
15.4.1 使用is进行类型检查 216
15.4.2 使用as、as!和as?进行类型转换 217
15.4.3 使用AnyObject和Any类型 220
15.5 本章小结 221
15.6 同步练习 221
第16章 扩展 223
16.1 “轻量级”继承机制 223
16.2 声明扩展 223
16.3 扩展计算属性 224
16.4 扩展方法 226
16.5 扩展构造函数 227
16.5.1 值类型扩展构造函数 227
16.5.2 引用类型扩展构造函数 228
16.6 扩展下标 229
16.7 本章小结 230
16.8 同步练习 230
第17章 协议 231
17.1 协议概念 231
17.2 协议定义和遵从 232
17.3 协议方法 232
17.3.1 协议实例方法 232
17.3.2 协议静态方法 233
17.3.3 协议可变方法 234
17.4 协议属性 236
17.4.1 协议实例属性 236
17.4.2 协议静态属性 237
17.5 面向协议编程 238
17.5.1 协议类型 238
17.5.2 协议的继承 240
17.5.3 协议扩展 242
17.5.4 协议的合成 243
17.5.5 扩展中遵从协议 244
17.6 面向协议编程示例:表视图中使用扩展协议 245
17.7 本章小结 247
17.8 同步练习 247
第18章 泛型 249
18.1 一个问题的思考 249
18.2 泛型函数 249
18.2.1 使用泛型函数 250
18.2.2 多类型参数 251
18.3 泛型类型 251
18.4 泛型扩展 253
18.5 本章小结 254
18.6 同步练习 254
第19章 Swift编码规范 255
19.1 命名规范 255
19.2 注释规范 257
19.2.1 文件注释 257
19.2.2 文档注释 258
19.2.3 代码注释 259
19.2.4 使用地标注释 260
19.3 声明 262
19.3.1 变量或常量声明 262
19.3.2 属性声明 263
19.4 代码排版 264
19.4.1 空行 264
19.4.2 空格 265
19.4.3 断行 266
19.4.4 缩进 268
19.5 本章小结 269
19.6 同步练习 269
第二部分 进阶篇
第20章 Swift内存管理 272
20.1 Swift内存管理概述 272
20.1.1 引用计数 273
20.1.2 示例:Swift自动引用计数 273
20.2 强引用循环 275
20.3 打破强引用循环 279
20.3.1 弱引用 279
20.3.2 无主引用 282
20.4 闭包中的强引用循环 285
20.4.1 一个闭包中的强引用循环示例 285
20.4.2 解决闭包强引用循环 286
20.5 本章小结 288
20.6 同步练习 288
第21章 错误处理 290
21.1 Cocoa错误处理模式 290
21.2 do-try-catch错误处理模式 291
21.2.1 捕获错误 292
21.2.2 错误类型 292
21.2.3 声明抛出错误 293
21.2.4 在函数或方法中抛出错误 293
21.2.5 try?和try!的使用区别 294
21.3 案例:MyNotes应用数据持久层实现 295
21.3.1 MyNotes应用介绍 296
21.3.2 MyNotes应用数据持久层设计 296
21.3.3 实现Note实体类 297
21.3.4 NoteDAO代码实现 297
21.3.5 使用defer语句释放资源 298
21.3.6 测试示例 299
21.4 本章小结 300
21.5 同步练习 301
第22章 Foundation框架 302
22.1 数字类NSNumber 302
22.1.1 获得NSNumber对象 302
22.1.2 比较NSNumber对象 304
22.1.3 数字格式化 305
22.1.4 NSNumber与Swift原生数字类型之间的桥接 307
22.2 字符串类 307
22.2.1 NSString类 308
22.2.2 NSMutableString类 310
22.2.3 NSString与String之间的桥接 312
22.3 数组类 313
22.3.1 NSArray类 313
22.3.2 NSMutableArray类 314
22.3.3 NSArray与Swift原生数组之间的桥接 315
22.4 字典类 316
22.4.1 NSDictionary类 316
22.4.2 NSMutableDictionary类 317
22.4.3 NSDictionary与Swift原生字典之间的桥接 318
22.5 NSSet集合类 319
22.5.1 NSSet类 320
22.5.2 NSMutableSet类 321
22.5.3 NSSet与Swift原生Set之间的桥接 322
22.6 文件管理 322
22.6.1 访问目录 322
22.6.2 目录操作 323
22.6.3 文件操作 324
22.7 字节缓存 327
22.7.1 访问字节缓存 327
22.7.2 示例:Base64解码与编码 330
22.8 日期与时间 332
22.8.1 NSDate和Date 332
22.8.2 日期时间格式化 334
22.8.3 NSCalendar、Calendar、NSDateComponents和DateComponents 335
22.8.4 示例:时区转换 337
22.9 使用谓词NSPredicate过滤数据 339
22.9.1 一个过滤员工花名册的示例 339
22.9.2 使用谓词NSPredicate 341
22.9.3 NSPrdicate与集合 342
22.9.4 格式说明符 343
22.9.5 运算符 344
22.10 使用正则表达式 347
22.10.1 在NSPredicate中使用正则表达式 347
22.10.2 使用NSRegularExpression 348
22.10.3 示例:日期格式转换 350
22.11 本章小结 352
第三部分 混合编程篇
第23章 Swift与Objective-C混合编程 354
23.1 选择语言 354
23.2 文件扩展名 354
23.3 Swift与Objective-C API映射 355
23.3.1 构造函数映射 355
23.3.2 方法名映射 357
23.4 同一应用目标中的混合编程 360
23.4.1 什么是目标 360
23.4.2 Swift调用Objective-C 363
23.4.3 Objective-C调用Swift 366
23.5 同一框架目标中的混合编程 370
23.5.1 链接库和框架 370
23.5.2 Swift调用Objective-C 372
23.5.3 测试框架目标 376
23.5.4 Objective-C调用Swift 380
23.6 本章小结 383
第24章 Swift与C/C++混合编程 384
24.1 数据类型映射 384
24.1.1 C语言基本数据类型 384
24.1.2 C语言指针类型 385
24.2 应用目标中的混合编程 392
24.2.1 Swift调用C API 392
24.2.2 Swift调用C++ API 393
24.3 框架目标中的混合编程 399
24.3.1 同一框架目标中Swift调用C或C++ API 399
24.3.2 Swift调用第三方库中的C或C++ API 402
24.4 案例:用SQLite嵌入式数据库实现MyNotes数据持久层 405
24.4.1 Note实体类代码 405
24.4.2 创建表 405
24.4.3 插入数据 407
24.4.4 查询数据 409
24.4.5 应用沙箱目录 411
24.4.6 表示层开发 412
24.5 本章小结 414
第四部分 游戏篇
第25章 SpriteKit游戏引擎 416
25.1 移动平台游戏引擎介绍 416
25.2 第一个SpriteKit游戏 416
25.2.1 创建工程 416
25.2.2 工程剖析 419
25.3 一切都是节点 426
25.3.1 节点“家族” 426
25.3.2 节点树 427
25.3.3 节点中重要的方法 428
25.3.4 节点中重要的属性 428
25.4 精灵 429
25.4.1 精灵类SKSpriteNode 429
25.4.2 案例:沙漠英雄场景 431
25.4.3 使用纹理图集性能优化 438
25.5 场景切换 441
25.5.1 场景切换方法 441
25.5.2 场景过渡动画 442
25.5.3 案例:沙漠英雄场景切换 443
25.6 动作 447
25.6.1 常用动作 447
25.6.2 组合动作 449
25.6.3 案例:帧动画实现 455
25.7 粒子系统 458
25.7.1 粒子系统属性 459
25.7.2 内置粒子系统模板 460
25.8 游戏音乐与音效 464
25.8.1 音频文件介绍 464
25.8.2 macOS和iOS平台音频优化 465
25.8.3 背景音乐 466
28.8.4 3D音效 467
25.9 物理引擎 468
25.9.1 物理引擎核心概念 469
25.9.2 物理引擎中的物体 469
25.9.3 接触与碰撞 471
25.9.4 案例:食品的接触与碰撞 472
25.10 本章小结 475
第五部分 项目实战篇
第26章 游戏App实战——迷失航线 478
26.1 《迷失航线》游戏分析与设计 478
26.1.1 《迷失航线》故事背景 478
26.1.2 需求分析 478
26.1.3 原型设计 479
26.1.4 游戏脚本 480
26.2 任务1:游戏工程的创建与初始化 481
26.2.1 迭代1.1:创建工程 481
26.2.2 迭代1.2:自定义类型维护 481
26.2.3 迭代1.3:添加资源文件 484
26.2.4 迭代1.4:添加粒子系统 486
26.3 任务2:创建Loading场景 486
26.3.1 迭代2.1:设计场景 486
26.3.2 迭代2.2:Loading动画 487
26.3.3 迭代2.3:预处理加载纹理 488
26.4 任务3:创建Home场景 489
26.4.1 迭代3.1:设计场景 489
26.4.2 迭代3.2:实现代码 490
26.5 任务4:创建设置场景 493
26.5.1 迭代4.1:设计场景 493
26.5.2 迭代4.2:实现代码 494
26.6 任务5:创建帮助场景 497
26.6.1 迭代5.1:设计场景 498
26.6.2 迭代5.2:实现代码 498
26.7 任务6:实现游戏场景 499
26.7.1 迭代6.1:设计场景 500
26.7.2 迭代6.2:创建敌人精灵 502
26.7.3 迭代6.3:创建玩家飞机精灵 506
26.7.4 迭代6.4:创建子弹精灵 507
26.7.5 迭代6.5:初始化游戏场景 508
26.7.6 迭代6.6:玩家移动飞机 512
26.7.7 迭代6.7:游戏循环与任务调度 513
26.7.8 迭代6.8:游戏场景菜单实现 514
26.7.9 迭代6.9:玩家飞机发射子弹 516
26.7.10 迭代6.10:子弹与敌人的碰撞检测 517
26.7.11 迭代6.11:玩家飞机与敌人的碰撞检测 520
26.8 任务7:游戏结束场景 521
26.8.1 迭代7.1:设计场景 522
26.8.2 迭代7.2:实现代码 523
26.9 还有“最后一公里” 524
26.9.1 添加图标 524
26.9.2 调整Identity和Deployment Info属性 526
29.9.3 调整程序代码 527
26.10 本章小结 528
· · · · · · (
收起)