1、CMYCMMYCYCMYKSwift进阶扉页.pdf 1 2017/4/12 15:05:11内 容 简 介本书涵盖了关于 Swi 程序设计的进阶话题。如果你已经通读 Apple 的Swi 编程指南,并且想要深入探索关于这门语言的更多内容,那么这本书正适合你!Swi 非常适合用来进行系统编程,同时它也能被用于书写高层级的代码。我们在书中既会研究像泛型、协议这样的高层级抽象的内容,也会涉足像封装 C 代码以及字符串内部实现这样的低层级话题。本书将帮助你进一步完善知识体系,带领你从 Swi 的入门或中级水平迈入 Swi 高级开发者的大门。未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。版权
2、所有,侵权必究。图书在版编目(CIP)数据Swi 进阶/(德)克里斯安道夫(Chris Eidhof),(德)奥勒毕格曼(Ole Begemann),德国空速网站著;王巍译.北京:电子工业出版社,2017.5ISBN 978-7-121-31200-7I.xSII.x克y奥z德王III.x程序语言程序设计 IV.xTP312中国版本图书馆 CIP 数据核字(2017)第 065891 号策划编辑:张春雨责任编辑:王静印刷:三河市良远印务有限公司装订:三河市良远印务有限公司出版发行:电子工业出版社北京市海淀区万寿路 173 信箱邮编:100036开本:787980 1/16 印张:18.75 字
3、数:410 千字版次:2017 年 5 月第 1 版印次:2017 年 5 月第 1 次印刷定价:75.00 元凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话:(010)88254888,88258888。质量投诉请发邮件至 ,盗版侵权举报请发邮件至 。本书咨询联系方式:010-51260888-。译者序我经常会收到 Swi 学习者和使用者发来的电子邮件,问我应该怎么进一步提高自己的 Swi水平,而在这种时候,我都会向他们推荐您手中的这本书Swi 进阶。在 2017 年 3 月的 TIOBE 最受欢迎编程语言排行榜中,Swi 首次进入前十
4、名,已经将它的“前辈”Objective-C 远远抛在脑后;而 Swi 3.0 的开源及跨平台,也为这门语言的使用范围和持续发展带来了前所未有的机遇和希望。在 Swi 高速发展的今天,越来越多的 Swi 开发者不仅仅满足于完成开发任务,他们更希望能知道如何写出优秀的代码,如何优雅高效地实现功能,以及如何更灵活地使用这门语言来应对改变。想要做到这些,我们就需要做到知其然,并知其所以然。Swi 进阶正是一本向您介绍 Swi 的种种语言特性“所以然”的书籍。本书的英文版由 objc.io 的创始人 Chris Eidhof1、著名科技编辑和博主 Ole Begemann2以及一直关注 Swi 的博客
5、 Airspeed Velocity3的幕后人员一同联合编写。本书原版一经公布,就引起了国外 Swi 社区的极大关注,可以说是国外高级 Swi 开发者几乎人手一本的必读读物。书中深入浅出地剖析了 Swi 里深层次的实现细节以及设计思路。对于包括诸如内建集合类型的底层实现、泛型和协议的设计、Swi 字符串的原理和使用逻辑、值类型和引用类型的适用场景和特点等话题,书中都进行了详细的分析。本书通过这些细致和系统的解释,为我们揭示了 Swi 的设计哲学,让我们在学习 Swi 的过程中,从“身在此山”变为“高屋建瓴”。虽然在技术精进的道路上没有捷径,但若将前人的经验和总结的精华作为基础,确实能让我们事半
6、功倍。技术书籍总会面临版本变动和更新的问题。本书的英文原版是在 2015 年 Swi 2 时发布的,其实该书的翻译工作也早在 2015 年年中就完成了。但是在 Swi 3 中,Apple 对这门语言进行了大幅的重塑和调整,本着对读者负责的态度,我们并没有急于推出本书的过时版本,而是在等待 Swi 趋于稳定后,直接以对应最新版本的形式进行发布。在能预见的未来中,1https:/ 4 及后续版本并不会发生像前面版本那样的大规模改动,因此我们认为学习和进阶Swi 的时机已经成熟。Swi 进阶一书在探讨问题时也对版本之间的差异进行了说明,让读者可以了解到技术变革的来龙去脉,并为未来的知识更新提前做好准
7、备。我们必须承认,在国内当前 Swi 的接受度和使用范围,已经与国外产生了一些差距。由此导致了 Swi 程序开发的平均水平也稍有落后。但我们相信这只是暂时的,随着 Swi 社区的日益强大,国内使用 Swi 的机会和应用场合,都会发生爆发式的增长。让更多的中国开发者有机会接触和了解 Swi 开发更深层次的内容,正是本书目的所在。王巍读者服务轻松注册成为博文视点社区用户(),您即可享受以下服务。提交勘误:您对书中内容的修改意见可在 提交勘误 处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。与作者交流:在页面下方 读者评论 处留下您的疑问或观点,与作者和其他读者
8、一同学习交流。页面入口:http:/ 进阶目录第 1 章介绍11.1本书所面向的读者21.2主题31.3术语61.4Swi 风格指南9第 2 章内建集合类型112.1数组11数组和可变性11数组和可选值13数组变形14数组类型252.2字典27可变性28有用的字典扩展28Hashable 要求302.3Set31集合代数32索引集合和字符集合33在闭包中使用集合342.4Range34第 3 章集合类型协议373.1序列37迭代器38v无限序列44不稳定序列44序列和迭代器之间的关系45子序列463.2集合类型47为队列设计协议48队列的实现50遵守 Collection 协议51遵守 Exp
9、ressibleByArrayLiteral 协议54关联类型553.3索引57索引失效58索引步进59链表603.4切片70实现自定义切片71切片与原集合共享索引74通用的 PrefixIterator743.5专门的集合类型75前向索引76双向索引77随机存取索引78MutableCollection79RangeReplaceableCollection803.6总结82第 4 章可选值844.1哨岗值844.2通过枚举解决魔法数的问题864.3可选值概览88if let88viSwift 进阶while let89双重可选值92if var and while var94解包后可选值的
10、作用域95可选链97nil 合并运算符99可选值 map101可选值 flatMap103使用 flatMap 过滤 nil104可选值判等105switch-case 匹配可选值108可选值比较1094.4强制解包的时机109改进强制解包的错误信息111在调试版本中进行断言1114.5多灾多难的隐式可选值113隐式可选值行为1134.6总结114第 5 章结构体和类1155.1值类型1165.2可变性1175.3结构体1205.4写时复制127写时复制(昂贵方式)129写时复制(高效方式)130写时复制的陷阱1325.5闭包和可变性1345.6内存135weak 引用137unowned 引
11、用138Swift 进阶vii5.7闭包和内存139结构体和类使用实践1395.8闭包和内存142引用循环143捕获列表1445.9总结145第 6 章函数1466.1函数的灵活性152函数作为数据1556.2局部函数和变量捕获1616.3函数作为代理163Foundation 框架的代理163结构体代理164使用函数,而非代理1656.4inout 参数和可变方法167嵌套函数和 inout169&不意味 inout 的情况1706.5计算属性和下标171延迟存储属性172使用不同参数重载下标173下标进阶1756.6自动闭包175escaping 标注1776.7总结179第 7 章字符串
12、1807.1不再固定宽度180字位簇和标准等价1817.2字符串和集合184字符串与切片1877.3简单的正则表达式匹配器189viiiSwift 进阶7.4ExpressibleByStringLiteral1927.5String 的内部结构193Character 的内部组织结构1997.6编码单元表示方式1997.7CustomStringConvertible 和CustomDebugStringConvertible2017.8文本输出流2037.9字符串性能2077.10展望211第 8 章错误处理2128.1Result 类型2138.2抛出和捕获2148.3带有类型的错误21
13、68.4将错误桥接到 Objective-C2178.5错误和函数参数218Rethrows2208.6使用 defer 进行清理2218.7错误和可选值2228.8错误链223链结果2238.9高阶函数和错误2248.10总结226第 9 章泛型2289.1重载228自由函数的重载229运算符的重载230使用泛型约束进行重载231使用闭包对行为进行参数化2359.2对集合采用泛型操作236二分查找236泛型二分查找238Swift 进阶ix集合随机排列241SubSequence 和泛型算法244重写与优化2469.3使用泛型进行代码设计247提取共通功能249创建泛型数据类型2509.4泛
14、型的工作方式251泛型特化253全模块优化2549.5总结255第 10 章协议25610.1面向协议编程258协议扩展260在协议扩展中重写方法26010.2协议的两种类型262类型抹消26410.3带有 Self 的协议26710.4协议内幕269性能影响27010.5总结271第 11 章互用性27211.1实践:封装 CommonMark272封装 C 代码库272封装 cmark_node 类型273更安全的接口27811.2低层级类型概览28411.3函数指针286xSwift 进阶第1章介绍Swift 进阶对一本书来说是一个很大胆的标题,所以我想我们应该先解释一下它意味着什么。当
15、我们开始本书第一版的写作时,Swi 才刚刚一岁。我们推测这门语言会在进入第二个年头的时候继续高速地发展,不过尽管我们十分犹豫,但还是决定在 Swi 2.0 测试版发布以前就开始写作。几乎没有别的语言能够在如此短的时间里就能吸引这么多的开发者前来使用。但是这留给了我们一个问题:如何写出“符合语言习惯”的 Swi 代码?对于某一个任务,有正确的做法吗?标准库给了我们一些提示,但是我们知道,即使是标准库本身也会随时间发生变化,它常常抛弃一切约定,又去遵守另一些约定。不过,在过去两年里,Swi 高速进化着,而优秀的 Swi 代码标准也日益明确。对于从其他语言迁移过来的开发者,Swi 可能看起来很像你原
16、来使用的语言,特别是它可能拥有你原来使用的语言中你最喜欢的那一部分。它可以像 C 语言一样进行低层级的位操作,但又可以避免许多未定义行为的陷阱。Ruby 的教徒可以在像是map或filter的轻量级的尾随闭包中感受到宾至如归。Swi 的泛型和 C+的模板如出一辙,但是额外的类型约束能保证泛型方法在被定义时就是正确的,而不必等到使用的时候再进行判定。灵活的高阶函数和运算符重载让你能够以 Haskell 或者 F#那样的风格进行编码。最后objc关键字允许你像在 Objective-C 中那样使用 selector 和各种运行时的动态特性。有了这些相似点,Swi 可以去适应其他语言的风格。比如,Objective-C 的项目可以自动地导入 Swi 中,很多 Java 或者 C#的设计模式也可以直接照搬过来使用。在 Swi 发布的前几个月,一大波关于单子(monad)的教程和博客也纷至杳来。但是失望也接踵而至。为什么我们不能像 Java 中的接口那样将协议扩展(protocol extension)和关联类型(associated type)结合起来使用?为什么数组不具有我们预想那样的协变(