为什么写这本书?关于Swift,已经有大量来自苹果的现成文档,而且还有更多的书正在编写中。为什么世界上依然需要关于这种编程语言的另一本书呢?
这本书尝试让你学会以 函数式 的方式进行思考。我们认为Swift有着合适的语言特性来适配 函数式 的编程方法。然而是什么使得程序具有函数式特性?又为何要一开始就学习关于函数式的内容呢?
很难给出函数式的准确定义——同样地,我们也很难给出面向对象编程,抑或是其他编程范式的准确定义。因此,我们会尽量把重点放在我们认为设计良好的Swift函数式程序应该具有的一些 特质 上:
· 模块化: 相比于把程序认为是一系列赋值和方法调用,函数式开发者更倾向于强调每个程序都能够被反复分解为越来越小的模块单元,而所有这些块可以通过函数装配起来,以定义一个完整的程序。当然,只有当我们能够避免在两个独立组件之间共享状态时,才能将一个大型程序分解为更小的单元。这引出我们的下一个关注特质。
· 对可变状态的谨慎处理: 函数式编程有时候(被半开玩笑地)称为“面向值编程”。面向对象编程专注于类和对象的设计,每个类和对象都有自己的封装状态。然而,函数式编程强调基于值编程的重要性,这能使我们免受可变状态或其他一些副作用的困扰。通过避免可变状态,函数式程序比其对应的命令式或者面向对象的程序更容易组合。
· 类型: 最后,一个设计良好的函数式程序在使用 类型 时应该相当谨慎。精心选择你的数据和函数的类型,将会有助于构建你的代码,这比其他东西都重要。Swift有一个强大的类型系统,使用得当的话,则它能够让你的代码更加安全和健壮。
我们认为这些特质是Swift程序员可能从函数式编程社区学习到的精华点。在这本书中,我们会通过许多实例和学习案例说明以上几点。
根据我们的经验,学习用函数式的方式思考并不容易。它挑战了我们既有的熟练解决问题的方式。对习惯写 for 循环的程序员来说,递归可能让我们倍感迷惑;赋值语句和全局状态的缺失让我们寸步难行;更不用提闭包、泛型、高阶函数和单子(Monad),这些东西简直让人痛不欲生。
在这本书中,我们假定你以前有过Objective-C(或其他一些面向对象的语言)的编程经验。书中不会涵盖Swift的基础知识,或者教你建立你的第一个Xcode工程,不过我们会尝试在适当的时候引用现有的Apple文档。你应当能自如地阅读Swift程序,并且熟悉常见的编程概念,如类、方法和变量等。如果你只是刚刚开始学习编程,则这本书可能并不适合你。在这本书中,我们希望让函数式编程易于理解,并消除人们对它的一些偏见。使用这些理念去改善你的代码并不需要你拥有数学的博士学位!函数式编程并不是Swift编程的 唯一 方式。但是我们相信学习函数式编程会为你的工具箱添加一件重要的新工具,不论你使用那种语言,这件工具都会让你成为一个更好的开发者。
示例代码
你可以在我们的GitHub仓库 1 中找到本书里所有的示例代码。这个仓库包括一些章节的playgrounds,以及其他章节的Swift文件和OSⅩ工程。
书籍更新
随着Swift的发展,我们会继续更新和改进这本书。如果你遇到任何错误,或者是想给我们其他类型的反馈,请在我们的GitHub仓库 2 中创建一个issue。
致谢
我们想要感谢众多帮助我们塑造了这本书的人。在此我们想要特别提及其中几位:
Natalye Childress 是我们的出版编辑。她给了我们很多宝贵的反馈意见,不仅保证了语言的正确性和一致性,而且确保了本书清晰易懂。
Sarah Lincoln 设计了本书的封面和布局。
Wouter想要感谢 乌得勒支大学 允许他能够在这本书上投入时间进行编写。
1 https://github.com/objcio/functional-swift
2 https://github.com/objcio/functional-swift
我们想要感谢测试版读者在本书的写作过程中给我们的反馈(按字母顺序排列):
Adrian Kosmaczewski,Alexander Altman,Andrew Halls,Bang Jun-young,Daniel Eggert,Daniel Steinberg,David Hart,David Owens II,Eugene Dorfman,f-dz-v,Henry Stamerjohann,J Bucaran,Jamie Forrest,Jaromir Siska,Jason Larsen,Jesse Armand,John Gallagher,Kaan Dedeoglu,Kare Morstol,Kiel Gillard,Kristopher Johnson,Matteo Piombo,Nicholas Outram,Ole Begemann,Rob Napier,Ronald Mannak,Sam Isaacson,Ssu Jen Lu,Stephen Horne,TJ,Terry Lewis,Tim Brooks,Ⅴadim Shpakovski.
Chris
Florian
Wouter