Advance Swift这个名字,对于一本书来说确实有些太宽泛了,所以我想在本书的开始先介绍一下这本书主要会介绍哪些方面的知识。
在写作这本书的时候Swift大约一家发布一年了。我们在Swift 2.0 Beta版发布前就开始写这本书,因为我们当时就推测,Swift在它诞生的第二年一定会有不小的改进。可能不会再有哪种语言能像Swift一样,凝聚了许多开发者的心血,在一年里就快速的迭代到了Beta版。
于是,可能有人对如何写出地道的、Swift式的代码持有疑问。从某种程度上来说,标准库里的代码值得借鉴。但即使是标准库,在过去的一年里也淘汰了一批旧的语法风格。
对于从别的语言转到Swift的程序员来说,不管你原来使用哪种语言,Swift对你来说总是似曾相识。底层的、精确到比特位的操作看上去和C很类似而且甚至和C语言一样高效,同时还不会产生很多未定义行为1。对于Ruby开发者来说,轻量的闭包和map、filter函数都是自己很熟悉的。C++工程师看到Swift的范型一定不会感到陌生,因为这就是C++中的模板(template)。不同的是,Swift会把类型约束写在定义中而不是实际调用的地方。灵活的使用高阶函数和运算符重载让你的代码颇具Haskell或F#风格。而@objc关键字允许你像在OC中一样使用选择子(selector)和运行时(runtime)。
考虑到以上相似性,我们可以发现Swift其实在吸收其他语言的一些特性。OC的示范工程几乎都可以自动转成Swift风格的。很快,你还可以看到很多书会用Swift来讲解设计模式(design pattern),而此前一般用的是Java或C#。接着,还会出现很多个人的技术博客。
不过随着你对Swift了解的深入,沮丧和失落也随之而来。你会很郁闷自己为什么不能在协议拓展中使用关联类型,而Java的接口(Interface)却可以。数组为什么没有按照预想的方式协变2。为什么不能写仿函数3。有时候,答案是Swift还没有完全实现这些功能,但在更多的情况下,要么是Swift提供了自己的另外一套解决方案,要么就是你其实误解了Swift的解决方案4。
Swift是一门很复杂的语言(其实大部分语言都是这样)。但它把它的复杂性隐藏的很好,你可以不用知道范型、重载、静态和动态分发的区别的情况下快速入门Swift并着手开发app。你也许永远都不会调用到C语言库,或者实现你自己的集合类型。但你迟早是要知道这些的,因为你需要把自己的代码变得优雅、可读或实现某些特定的需求。
这本书主要讲的就是以上这些高级特性,我们试图回答一些经常在论坛上可以看到的问题,比如“我怎么实现这个?”、“为什么Swift要那样做?”。希望你读过此书后,能够不止了解Swift的语言基础,还能了解很多它的高级特性,同时也对Swift的工作原理有更深的了解。了解本书中的知识点是你成为高级Swift程序员的必要但不充分条件。
#译者注 [1]:C语言开发者应该对UB比较熟悉,比如一个int型整数溢出后的值。
[2]:协变让一个粗粒度接口可以接收一个更加具体的接口作为参数。
[3]:仿函数是使一个类的使用看上去象一个函数,比如C++里重载()运算符。
[4]:这里实在是不会翻译成技术语言。举个不恰当的例子说明:C的int表示整数,但如果Swift的int其实表示的是字符串,那你不管怎么用int,都肯定不能达到你的需求。