2014年6月2日,苹果公司在WWDC大会最后宣布了一项令人震惊的公告:“我们开发了一门全新的编程语言。”开发者社区对此感到非常惊讶,因为他们已经习惯了Objective-C,因此开始怀疑苹果公司是否有能力将既有资产迁移过来。不过,这一次开发者社区错了。
Swift发布后,众多开发者立刻开始检视这门新语言:学习并批判它,决定是否该使用它。我的第一步就是将自己所有的iOS应用都转换为Swift;这足以说服我自己,虽然Swift有各种各样的缺点,但它值得每一个iOS编程新兵去掌握;自此以后,我的书都会假设读者使用的是Swift。
Swift语言从一开始的设计上就具备如下主要特性:
面向对象
Swift是一门现代化的、面向对象的语言。它是完全面向对象的:“一切皆对象。”
清晰
Swift易于阅读和编写,其语法糖很少,隐藏的捷径也不多。其语法清晰、一致且明确。
安全
Swift使用强类型,从而确保它知道(并且你也知道)在每一时刻每个对象引用都是什么类型的。
小巧
Swift是一门小巧的语言,提供了一些基本的类型与功能,除此之外别无其他。其他功能需要由你的代码,或你所使用的代码库(如Cocoa)来提供。
内存管理
Swift会自动管理内存。你很少需要考虑内存管理问题。
兼容于Cocoa
Cocoa API是由C和Objective-C编写的。Swift在设计时就明确保证可与大多数Cocoa API交互。
这些特性使得Swift成为学习iOS编程的一门优秀语言。
其他选择Objective-C依然存在,如果你喜欢还可以使用它。实际上,编写一个同时包含Swift代码与Objective-C代码的应用是很容易的;有时也需要这么做。不过,Objective-C缺少Swift的一些优势。Objective-C在C之上增加了面向对象特性。因此,它只是部分面向对象的;它同时拥有对象与标量数据类型,其对象需要对应于一种特殊的C数据类型(指针)。其语法掌握起来很困难;阅读与编写嵌套的方法调用会让人眼花,它还引入了一些黑科技,如隐式的nil测试。其类型检查可以而且经常关闭,这会导致程序员犯错,将消息发送给错误的对象类型并导致程序崩溃。Objective-C使用了手工的内存管理;新引入的ARC(自动引用计数)减轻了程序员的一些负担,并且极大地降低了程序员犯错的可能性,不过错误依旧有可能发生,内存管理最终还是要靠手工来完成。
最近向Objective-C增加或修订的特性(ARC、合成与自动合成、改进的字面值数组与字典的语法、块等)让Objective-C变得更加简单和便捷,不过这些修复也使语言变得更加庞大,甚至会引起困惑。由于Objective-C必须要包含C,因此其可扩展和修订的程度会受到限制。另一方面,Swift则是个全新的开始。如果你梦想完全修订Objective-C,从而创建一个更棒的Objective-C,那么Swift可能就是你所需要的。它将一个先进、合理的前端置于你与Cocoa Objective-C API之间。
因此,Swift就是本书通篇所使用的编程语言。不过,读者还需要对Objective-C(包括C)有所了解。Foundation与Cocoa API(这些内建的命令是你的代码一定会用到的,从而让iOS设备上的一切可以实现)依旧使用C与Objective-C编写。为了与它们进行交互,你需要知道这些语言需要什么。比如,为了在需要NSArray时可以传递一个Swift数组,你需要知道到底是什么对象可以作为Objective-C NSArray的元素。
因此,本书虽然不会讲解Objective-C,但我会对其进行足够充分的介绍,从而使你在文档和互联网上遇到这类问题时能够知道解决方案,我还会时不时地展示一些Objective-C代码。本书第三部分关于Cocoa的介绍会帮助大家以Objective-C的方式来思考——因为Cocoa API的结构与行为基本上是基于Objective-C的。本书最后的附录会详细介绍Swift与Objective-C之间的交互方式,同时还会介绍如何以Swift和Objective-C混合编程来编写应用。
本书范围
本书实际上是我的另一本书《Programming iOS 9》的配套参考书,该书以本书的结束作为起点。它们之间是互补的。我相信,这两本书的结构合理、内容通俗易懂。它们提供了开始编写iOS应用所需的完整基础知识;这样,在开始编写iOS应用时,你会对将要做的事情以及方向有着深刻的理解。如果编写iOS程序类似于用砖盖房子,那么本书将会介绍什么是砖以及如何使用它,而《Programming iOS 9》则会给你一些实际的砖并告诉你如何将其堆砌起来。
阅读完本书后,你将知道Swift、Xcode以及Cocoa框架的基础,接下来就可以直接开始阅读《Programming iOS 9》了。相反,《Programming iOS 9》假设你已经掌握了本书所介绍的内容;一开始它就会介绍视图与视图控制器,同时假设你已经掌握了语言本身和Xcode IDE。如果开始阅读《Programming iOS 9》并且想知道书中一些没有讲解过的东西,如Swift语言基础、UIApplicationMain函数、nib加载机制、Cocoa的委托与通知模式、保持循环等,那就不要尝试在该书中寻找答案了,我并没有在那本书中介绍这些内容,因为这里都介绍过了。
本书的3部分内容将会介绍iOS编程的基础知识:
·第一部分从头开始介绍Swift语言。我没有假设你知道任何其他的编程语言。我讲解Swift的方式与其他人不同,如苹果公司的方式;我会采取系统的方式,逐步推进,不断深入。同时,我会讲解最本质的内容。Swift并不是一门庞大的语言,不过却有一些微妙之处。你无须深入到全部内容当中,我也不会面面俱到地讲解。你可能永远都不会遇到一些问题,即便遇到了,那也说明你已经进入到了高级Swift的世界当中,而这已经超出了本书的讨论范围。比如,读者可能会惊奇地发现我在书中从来都没有提到过Swift playground和REPL。本书的关注点在于实际的iOS编程,因此我对Swift的介绍将会关注在这些常见、实际的方面上;以我的经验来看,这些内容才是iOS编程当中用得最多的。
·第二部分将会介绍Xcode,这是我们进行iOS编程的地方。我将介绍何为Xcode项目,如何将其转换为应用,如何通过Xcode来查阅文档,如何编写、导航与调试代码,以及如何在设备上运行应用并提交到App Store等过程。该部分还有重要的一章用来介绍nib与nib编辑器(Interface Builder),包括插座变量与动作,以及nib加载机制;不过,诸如nib中的自动布局限制等专门的主题则不在本书的讨论范围之中。
·第三部分将会介绍Cocoa Touch框架。在进行iOS编程时,你会使用到苹果公司提供的大量框架。这些框架共同构成了Cocoa;为iOS编程提供API的Cocoa叫作Cocoa Touch。你的代码最终将是关于如何与Cocoa进行通信的。Cocoa Touch框架提供了iOS应用所需的底层功能。不过要想使用框架,你需要按照框架的想法去做,将代码放到框架期望的位置处,实现框架要求你实现的功能。有趣的是,Cocoa使用的是Objective-C,你使用的是Swift:你需要知道Swift代码如何与Cocoa的特性与行为进行交互。Cocoa提供了重要的基础类,并添加了一些语言与架构上的设施,如类别、协议、委托、通知,以及关于内存管理的基本功能。该部分还会介绍键值编码与键值观测。
本书读者将会掌握任何优秀的iOS开发者所需的基础知识与技术;但本书并不会介绍如何编写一个有趣的iOS应用,书中会大量使用我自己编写的应用与实际的编程场景来阐述理论知识。接下来各位读者就可以阅读《Programming iOS 9》了。
版本
本书使用的是Swift 2.0、iOS 9与Xcode 7。
总的来说,本书并不会对老版本的iOS与Xcode做过多介绍。我也不会有意在书中对老版本的软件进行讲解,毕竟这些内容在我之前的书中都有过介绍。不过,本书会针对向后兼容性给出一些建议(特别是在第9章)。
Xcode 7所包含的Swift语言(Swift 2.0)相比于之前的版本Swift 1.2发生了很大的变化。如果之前使用过Swift 1.2,那么你就会发现如果不做一些修改,代码是无法在Swift 2.0中编译通过的。与之类似,书中的代码使用Swift 2.0编写而成,它也完全无法与Swift 1.2保持兼容。你之前可能有过Swift 1.2的编程经验,随着我的不断讲解,你会发现不少重要的语言特性在Swift 2.0中都发生了变化。不过,我并不会介绍Swift 1.2;如果想要了解(虽然我不知道你为什么要了解),那么请参考本书的前一版。
致谢
首先感谢O’Reilly Media的工作人员,正是他们才让一本书的写作过程充满了快乐:Rachel Roumeliotis、Sarah Schneider、Kristen Brown、Dan Fauxsmith与Adam Witwer。我也不会忘记编辑Brian Jepson,虽然他并未参与本版的工作,但对我的影响却一直都在。
一直以来,一些优秀的软件对我起到了巨大的帮助作用,我在写作本书的过程中一直都心存谢意。这些软件主要有:
·git(http://git-scm.com)
·SourceTree(http://www.sourcetreeapp.com)
·TextMate(http://macromates.com)
·AsciiDoc(http://www.methods.co.nz/asciidoc)
·BBEdit(http://barebones.com/products/bbedit/)
·Snapz Pro X(http://www.ambrosiasw.com)
·GraphicConverter(http://www.lemkesoft.com)
·OmniGraffle(http://www.omnigroup.com)
我通过忠实的Unicomp Model M键盘(http://pckeyboard.com)完成了全书的输入与编辑工作,如果没有它我是不可能在如此长的时间内轻松敲下这么多字的。请通过http://matt.neuburg.usesthis.com了解我的工作环境。
《Programming iOS 4》前言
编程框架体现了一个人的品格,它是创建者对于目标与心智的反映。第一次使用Cocoa Touch时,我对其品格的评价是这样的:“喔,创建它的人真是绝顶聪明啊!”一方面,内建的界面对象数量有意得到了限制;另一方面,一些对象的功能与灵活性(特别是UITableView等)要比其OS X的对应者更加强大。更为重要的是,苹果公司提供了一种聪明的方式(UIViewController)来帮助开发者创建整个界面并使用一个界面替换掉另一个,这些以一种可控、层次化的方式来实现,这样小小的iPhone就可以在一个应用中显示多个界面了,还不会让用户迷失或感到困惑。
iPhone的流行(大量免费与便宜的应用起到了很大的帮助作用)以及随后iPad的流行让很多新的开发者看到为这些设备编写程序是值得的,虽然他们对OS X可能没有相同的感觉。苹果公司自己的年度WWDC开发者大会也反映出了这种趋势,其重心也由OS X逐渐向iOS倾斜。
不过,人们渴望编写iOS程序的想法也导致了这样一种趋势:还没有学会走就开始跑了。iOS赋予了开发者强大的能力,心有多大舞台就有多大,不过这也是需要基础的。我常常看到一些iOS开发者提出的问题,虽然他们在编写着应用,但其对基础知识的理解非常肤浅。
这种情况促使我写作了这本书,本书旨在介绍iOS的基础知识。我喜欢Cocoa,也一直希望能有机会写一本关于Cocoa的图书,不过iOS的流行却让我编写了一本关于iOS的图书。我尝试采取一种合乎逻辑的方式进行说明和讲解,介绍iOS编程所需的原则与元素。正如之前的图书一样,我希望你能完整阅读这本书(学习新东西肯定会不停翻书),并将其作为案头参考。
本书并不是要代替苹果公司自己的文档与示例项目。那些都是非常棒的资源,随着时间的流逝将会变得越来越好。在准备本书写作的过程中我也将其作为参考资源。但是,我发现它们并不是按照顺序以一种合理的方式来完成一个功能的。在线文档会假设你的预备知识;它不能确保你会按照给定的方式来完成。此外,在线文档更适合作为参考而不是指南。完整的示例(无论注释有多么充分)都是难以跟着学习的;它可以作为演示,但却无法作为教学资源。
另外,图书的章节号和页码连续,内容的连贯性比较强;我可以在你学习视图控制器之前假定你已经知道视图了,因为第一部分位于第二部分之前。此外,我还会将自己的经验逐步分享给你。在全书中,你会发现我不断提及“常见的初学者错误”;除了一些其他人的错误,在大多数情况下,这些都是我曾经犯过的错误。我会告诉你一些陷阱,因为这些都是我曾经遇到过的,我相信你也一定会遇到。你还会看到我给出了不少示例,目的是解释一个大应用的一小部分内容。这并非用于讲解编程的一个已经完成的大程序,而是开发这个程序时的思考过程。我希望你在阅读本书时能够掌握这种思考过程。
本书约定
本书中使用以下排版约定:
斜体(Italic)
表示新术语、URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constant width)
表示代码示例,以及插穿在文中的代码,包括:变量或函数名、数据库、数据类型、环境变量、语句,以及关键字。
等宽粗体(Constant width bold)
表示新术语、URL、电子邮件地址、文件名和文件扩展名。
等宽斜体(Constant width italic)
表示新术语、URL、电子邮件地址、文件名和文件扩展名。
这个元素表示提示或建议。
这个元素表示一般注解。
这个元素表示警告。
如何使用示例代码
本书在这里帮助你完成你的工作。总的来讲,你可以在你的程序和文档中使用本书中的代码。你不需要联系我们以征得许可,除非你正在复制代码中的重要部分。比如,使用书中的多段代码写一个程序并不需要获得许可。
若将O’Reilly公司出版的书中的例子制成光盘来销售或发行则需要获得许可。在回答问题时,引用本书和列举书中的例子代码并不需要许可。把本书中的代码作为你产品文档的重要部分时需要获得许可。
我们希望但并不要求你在引用本书内容时说明引文的文献出处。引用通常包括题目、作者、出版社和ISBN号。例如,《iOS 9 Programming Fundamentals with Swift》,Matt Neuburg(O’Reilly)。Copyright 2016 Matt Neuburg,978-1-491-93677-1。
如果你感觉你对代码示例的使用超出合理使用以及上述许可范围,请通过[email protected]联系我们。
Safari®图书在线
Safari图书在线(www.safaribooksonline.com)是一个按需数字图书馆,它采用图书和视频两种形式发布专业级的内容,作者都是来自技术和商业领域的世界顶尖专家。
技术专家、软件开发者、网站设计者和商业及创新专家都使用Safari图书在线作为他们研究、解决问题、学习和职业资格培训的首要资源。
Safari图书在线为各种组织、政府机构和个人提供丰富的产品和定价程序。订购者可在一个全文可检索数据库中浏览数以千计的图书、培训视频和预出版手稿。它们来自O’Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology等的众多出版社。关于Safari图书在线的更多信息,请在线访问我们。
如何联系我们
美国:
O’Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
我们为本书提供了网页,该网页上面列出了勘误表、范例和任何其他附加的信息。您可以访问如下网页获得:
http://oreil.ly/HP-Drupal
要询问技术问题或对本书提出建议,请发送电子邮件至:
[email protected]
要获得更多关于我们的书籍、会议、资源中心和O’Reilly网络的信息,请参见我们的网站:
http://www.oreilly.com.cn
http://www.oreilly.com