在本书中,我们涵盖了Swift程序设计的一些进阶话题。如果你已经通读Apple的Swift编程指南,并且想要深入探索关于这门语言的更多内容,那么这本书正适合你!Swift非常适合用来进行系统编程,而同时它也能被用于书写高层级的代码。我们在书中既会研究像是泛型、协议这样的高层级抽象的内容,也会涉足像是封装C代码以及字符串内部实现这样的低层级话题。
目录
- 第1章介绍1
- 1.1 本书所面向的读者2
- 1.2 主题3
- 1.3 术语6
- 1.4 Swift风格指南9
- 第2章内建集合类型11
- 2.1 数组11
- 数组和可变性11
- 数组和可选值13
- 数组变形14
- 数组类型25
- 2.2 字典27
- 可变性28
- 有用的字典扩展28
- Hashable 要求30
- 2.3 Set 31
- 集合代数32
- 索引集合和字符集合33
- 在闭包中使用集合34
- 2.4 Range 34
- 第3章集合类型协议37
- 3.1 序列37
- 迭代器38
- 无限序列44
- 不稳定序列44
- 序列和迭代器之间的关系45
- 子序列46
- 3.2 集合类型47
- 为队列设计协议48
- 队列的实现50
- 遵守Collection 协议51
- 遵守ExpressibleByArrayLiteral 协议54
- 关联类型55
- 3.3 索引57
- 索引失效58
- 索引步进59
- 链表60
- 3.4 切片70
- 实现自定义切片71
- 切片与原集合共享索引74
- 通用的PrefixIterator 74
- 3.5 专门的集合类型75
- 前向索引76
- 双向索引77
- 随机存取索引78
- MutableCollection 79
- RangeReplaceableCollection 80
- 3.6 总结82
- 第4章可选值84
- 4.1 哨岗值84
- 4.2 通过枚举解决魔法数的问题86
- 4.3 可选值概览88
- if let 88
- while let 89
- 双重可选值92
- if var and while var 94
- 解包后可选值的作用域95
- 可选链97
- nil 合并运算符99
- 可选值map 101
- 可选值flatMap 103
- 使用flatMap 过滤nil 104
- 可选值判等105
- switch-case 匹配可选值108
- 可选值比较109
- 4.4 强制解包的时机109
- 改进强制解包的错误信息111
- 在调试版本中进行断言111
- 4.5 多灾多难的隐式可选值113
- 隐式可选值行为113
- 4.6 总结114
- 第5章结构体和类115
- 5.1 值类型116
- 5.2 可变性117
- 5.3 结构体120
- 5.4 写时复制127
- 写时复制(昂贵方式) 129
- 写时复制(高效方式) 130
- 写时复制的陷阱132
- 5.5 闭包和可变性134
- 5.6 内存135
- weak 引用137
- unowned 引用138
- 5.7 闭包和内存139
- 结构体和类使用实践139
- 5.8 闭包和内存142
- 引用循环143
- 捕获列表144
- 5.9 总结145
- 第6章函数146
- 6.1 函数的灵活性152
- 函数作为数据155
- 6.2 局部函数和变量捕获161
- 6.3 函数作为代理163
- Foundation 框架的代理163
- 结构体代理164
- 使用函数,而非代理165
- 6.4 inout 参数和可变方法167
- 嵌套函数和inout 169
- & 不意味inout 的情况170
- 6.5 计算属性和下标171
- 延迟存储属性172
- 使用不同参数重载下标173
- 下标进阶175
- 6.6 自动闭包175
- @escaping 标注177
- 6.7 总结179
- 第7章字符串180
- 7.1 不再固定宽度180
- 字位簇和标准等价181
- 7.2 字符串和集合184
- 字符串与切片187
- 7.3 简单的正则表达式匹配器189
- 7.4 ExpressibleByStringLiteral 192
- 7.5 String 的内部结构193
- Character 的内部组织结构199
- 7.6 编码单元表示方式199
- 7.7 CustomStringConvertible 和
- CustomDebugStringConvertible 201
- 7.8 文本输出流203
- 7.9 字符串性能207
- 7.10 展望211
- 第8章错误处理212
- 8.1 Result 类型213
- 8.2 抛出和捕获214
- 8.3 带有类型的错误216
- 8.4 将错误桥接到Objective-C 217
- 8.5 错误和函数参数218
- Rethrows 220
- 8.6 使用defer 进行清理221
- 8.7 错误和可选值222
- 8.8 错误链223
- 链结果223
- 8.9 高阶函数和错误224
- 8.10 总结226
- 第9章泛型228
- 9.1 重载228
- 自由函数的重载229
- 运算符的重载230
- 使用泛型约束进行重载231
- 使用闭包对行为进行参数化235
- 9.2 对集合采用泛型操作236
- 二分查找236
- 泛型二分查找238
- 集合随机排列241
- SubSequence和泛型算法244
- 重写与优化246
- 9.3 使用泛型进行代码设计247
- 提取共通功能249
- 创建泛型数据类型250
- 9.4 泛型的工作方式251
- 泛型特化253
- 全模块优化254
- 9.5 总结255
- 第10章协议256
- 10.1 面向协议编程258
- 协议扩展260
- 在协议扩展中重写方法260
- 10.2 协议的两种类型262
- 类型抹消264
- 10.3 带有Self 的协议267
- 10.4 协议内幕269
- 性能影响270
- 10.5 总结271
- 第11章互用性272
- 11.1 实践:封装CommonMark 272
- 封装C代码库272
- 封装cmark_node 类型273
- 更安全的接口278
- 11.2 低层级类型概览284
- 11.3 函数指针286