第1章 工欲善其事,必先利其器——Swift语言基础
Swift是苹果公司在WWDC2014大会上所发布的一门全新的编程语言,用于编写OS X和iOS应用程序。苹果公司在设计Swift语言时,就有意让其和Objective-C共存,Objective-C是苹果操作系统在导入Swift前使用的编程语言。本章将带领大家初步认识Swift这门神奇的开发语言,让读者为学习本书后面的知识打下基础。
1.1 Swift概述
Swift 是一种为开发 iOS 和 OS X 应用程序而推出的全新编程语言,是建立在 C 语言和Objective-C语言基础之上的,并且没有C语言的兼容性限制。Swift采用安全模型的编程架构模式,并且使整个编程过程变得更容易、更灵活、更有趣。另外,Swift 完全支持市面上的主流框架——Cocoa和Cocoa Touch,这为开发人员重新构建软件和提高开发效率带来了巨大的帮助。本节将带领大家一起探寻Swift的诞生历程。
1.1.1 Swift的创造者
苹果公司的Swift语言的创造者是苹果开发者工具部门总监Chris Lattner(1978年出生)。Chris Lattner是LLVM项目的主要发起人与作者之一,也是Clang编译器的作者。Chris Lattner曾经开发了LLVM,这是一种用于优化编译器的基础框架,能将高级语言转换为机器语言。LLVM极大地提高了高级语言的效率,Chris Lattner也因此获得了首届SIGPLAN奖。
2005年,Chris加入LLVM开发团队,正式成为苹果的一名员工。在苹果公司的9年间,他由一名架构师一路升职为苹果开发者工具部门总监。目前,Chris Lattner主要负责Xcode项目,这也为Swift的开发提供了灵感。
Chris Lattner从2010年7月才开始开发Swift语言,当时它在苹果内部属于机密项目,只有很少人知道这一语言的存在。Chris Lattner 在个人博客上称,Swift 的底层架构大多是他自己开发完成的。2011年,其他工程师开始参与项目开发,Swift 也逐渐获得苹果内部重视,直到2013年成为苹果主推的开发工具。
Swift 的开发结合了众多工程师的心血,包括语言专家、编译器优化专家等,苹果其他团队也为改进产品提供了很大帮助。同时Swift也借鉴了其他语言(如Objective-C、Rust、Ruby等)的优点。
Swift语言的核心吸引力在于Xcode Playgrounds功能和REPL,它们使开发过程具有更好的交互性,也更容易上手。Playgrounds在很大程度上受到了Bret Victor的理念和其他互动系统的启发。同样,具有实时预览功能的 Swift 使编程变得更简单,学习起来也更加容易,目前已经引起了开发者的极大兴趣。这有助于苹果吸引更多的开发者,甚至将改变计算机科学的教学方式。图1-1是Chris Lattner在WWDC2014大会上对Swift进行演示。
图1-1 Chris Lattner在WWDC2014大会上对Swift进行演示
1.1.2 Swift的优势
在 WWDC2014 大会中,苹果公司展示了如何能让开发人员更快进行代码编写及显示结果的“Swift Playground”,在左侧输入代码的同时,可以在右侧实时显示结果。苹果公司表示,Swift是基于Cocoa和Cocoa Touch专门设计的。由于Swift可以与Objective-C兼容使用,因此,开发人员可以在开发过程中进行无缝切换。
具体来说,Swift语言的突出优势如下所示。
(1)易学。
作为一门苹果独立发布的支持型开发语言,Swift语言的语法内容混合了Objective-C、JavsScript和Python,其语法简单、使用方便、易学,大大降低了开发者入门的门槛。同时Swift语言可以与Objective-C混合使用,对于用惯了高难度Objective-C语言的开发者来说,Swift语言更加易学。
(2)功能强大。
Swift 允许开发者通过更简洁的代码来实现更多的内容。在 WWDC2014 发布会上,苹果演示了如何只通过一行简单的代码,完成一个完整图片列表加载的过程。另外,Swift 还可以让开发人员一边编写程序,一边预览自己的应用程序。
(3)提升性能。
Swift语言可以提升程序性能,并同时降低开发难度,没有开发者不喜欢这样的编程语言。
(4)简洁、精良、高效。
Swift是一种非常简洁的语言。与Python类似,不必编写大量代码即可实现强大的功能,并且也有利于提高应用开发速度。Swift可以更快捷有效地编译出高质量的应用程序。
(5)执行速度快。
Swift的执行速度比Objective-C更快,这样会在游戏中看见更引人入胜的画面(需要苹果新的Metal界面的帮助),而其他应用也会有更好的响应性。
(6)全面融合。
苹果对全新的Swift语言的代码进行了大量简化,在更快、更安全、更好的交互、更现代的同时,开发者们可以在同一款软件中同时用Objective-C、Swift、C3种语言,这样便实现了3类开发人员的完美融合。
1.2 搭建开发环境
都说“工欲善其事,必先利其器”,这一说法在编程领域同样行得通,学习 Swift 开发也离不开好的开发工具的帮助。在本节中,将详细讲解搭建Swift语言开发环境的基本知识。
1.2.1 Xcode 6介绍
要开发iOS的应用程序,需要一台安装有Xcode工具的Mac OS X电脑。Xcode是苹果提供的开发工具集,它提供了项目管理、代码编辑、创建执行程序、代码调试、代码库管理和性能调节等功能。这个工具集的核心就是Xcode程序,提供了基本的源代码开发环境。
Xcode是一款强大的专业开发工具,可以简单、快速而且以我们熟悉的方式执行绝大多数常见的软件开发任务。相对于创建单一类型的应用程序所需要的能力而言,Xcode要强大得多,它的设计目的是使我们可以创建任何想象到的软件产品类型,从Cocoa及Carbon应用程序,到内核扩展及Spotlight导入器等各种开发任务,Xcode都能完成。Xcode独具特色的用户界面可以帮助我们以各种不同的方式来漫游工具中的代码,并且可以访问工具箱下面的大量功能,包括 GCC、javac、jikes和GDB,这些功能都是制作软件产品所需要的。它是一个由专业人员设计又由专业人员使用的工具。
由于能力出众,Xcode 已经被 Mac 开发者社区广为采纳。而且随着苹果电脑向基于 Intel 的Macintosh迁移,转向Xcode变得比以往任何时候更加重要。这是因为使用Xcode可以创建通用的二进制代码,这里所说的通用二进制代码是一种可以把PowerPC和Intel架构下的本地代码同时放到一个程序包的执行文件格式。事实上,对于还没有采用Xcode的开发人员,转向Xcode是将应用程序连编为通用二进制代码的第一个必要的步骤。
Xcode的官方地址是https://developer.apple.com/xcode/downloads/,如图1-2所示。
图1-2 Xcode的官方地址
截止到2014年6月,市面上最主流的版本是Xcode 5,最新版本是为Swift语言推出的Xcode 6 beta。Xcode 6 beta具有以下几个最突出的特点。
(1)Xcode 6 增加了一个全新的 iOS 模拟器,允许开发者根据设备调整应用尺寸,除了“Resizable iPhone”和“Resizable iPad”之外,还包括iPhone 5/5S、iPad 2/Retina/Air等具体设备,如图1-3所示。
图1-3 全新的iOS模拟器
(2)完全支持Swift编程。Xcode 6为开发者引入了一种全新的设计和开发应用的方式,深度支持Swift编程,开发者不仅能使用100%的Swift代码来创建一款崭新的应用,还可以向已存在的应用添加Swift代码或框架,并在Swift或Objective-C中查看文档。“Jump to Definition”、“Open Quickly”等在Swift中均能很好地工作,甚至Objective-C的头定义在Swift语法中也能良好地呈现。
(3)实时的代码效果预览。现在,开发者在使用Interface Builder设计界面时,能够实时地预览代码效果。当程序运行时,自定义对象将在设计时展现。当开发者修改自定义视图代码时,Interface Builder的设计画布则会自动更新,而无需任何的构建和运行操作。
此外,其所包含的API还支持向IB Inspector添加参数来快速修改视图,甚至开发者还可以预先填充示例数据视图来让界面更加准确。而支持UIKit大小类的iOS脚本则能够让开发者为所有iOS设备开发单一的通用脚本,不仅能为特定的设备尺寸或方向进行行为选择,还可以保持接口的一致性,且易于维护。
(4)新增View调试功能。Xcode 6实现了此前备受开发者期待的View Debuger。现在,调试应用UI就像单击那样简单,开发者可以轻而易举地看到为什么一个视图可能会被裁剪或隐藏,并在 Inspector 中检查和调试约束及其他参数。当然,Xcode 还包含了其他新的调试工具,比如调试Gauge来监控I/O用法、增强版的iCloud Gauge等,而Debug Navigator也将显示更有用的信息,包括栈框架记录和块队列等。
1.2.2 下载并安装Xcode 6
其实对于初学者来说,只需安装Xcode即可。通过使用Xcode,既能开发iPhone程序,也能够开发iPad程序。并且Xcode还是完全免费的,通过它提供的模拟器就可以在计算机上测试iOS程序。但是,如果要发布iOS程序或在真实机器上测试iOS程序,就需要花99美元了。
1.下载Xcode
(1)下载的前提是先注册成为一名开发人员,到苹果开发页面主页https://developer.apple.com/,如图1-4所示。
图1-4 苹果开发页面主页
(2)登录Xcode的下载页面https://developer.apple.com/xcode/downloads/,找到“Xcode 6 beta”选项,如图1-5所示。
图1-5 Xcode的下载页面
(3)如果是付费账户,可以直接在苹果官方网站中下载获得。如果不是付费会员用户,可以从网络中搜索热心网友们的共享信息,以此达到下载Xcode 6的目的。
注意
可以使用App Store来获取Xcode,这种方式的优点是完全自动,操作方便。
2.安装Xcode
(1)下载完成后单击打开下载的“.dmg”格式文件,如图1-6所示。
图1-6 打开下载的Xcode文件
(2)双击Xcode下载到的文件开始安装,在弹出的对话框中单击“Continue”按钮,如图1-7所示。
图1-7 单击“Continue”按钮
(3)在弹出的欢迎界面中单击“Agree”按钮,如图1-8所示。
图1-8 单击“Continue”按钮
(4)在弹出的对话框中单击“Install”按钮,如图1-9所示。
图1-9 单击“Continue”按钮
(5)在弹出的对话框中输入用户名和密码,然后单击按钮“好”,如图1-10所示。
图1-10 单击“Agree”按钮
(6)在弹出的新对话框中显示安装进度,进度完成后的界面如图1-11所示。
图1-11 完成安装
(7)Xcode 6的默认启动界面如图1-12所示。
图1-12 启动Xcode 6后的初始界面
注意
(1)考虑到很多初学者是学生用户,如果没有购买苹果机的预算,可以在Windows系统上采用虚拟机的方式安装OS X系统。
(2)无论是已经有一定 Xcode 经验的开发者,还是刚刚开始迁移的新用户,都需要对Xcode的用户界面及如何用Xcode组织软件工具有一些理解,这样才能真正高效地使用这个工具。这种理解可以加深读者对隐藏在 Xcode 背后的编程思想的认识,并帮助读者更好地使用Xcode。
(3)建议读者将Xcode安装在OS X的Mac机器上,也就是装有苹果系统的苹果机上。通常来说,在苹果机器的 OS X 系统中已经内置了 Xcode,默认目录是“/Developer/Applications”。
1.3 使用Xcode开发环境
接下来讲解使用Xcode开发环境的基本知识,为读者步入后面Objective-C知识的学习打下坚实的基础。
1.3.1 改变公司名称
通过Xcode编写代码,代码的头部会有类似于图1-13所示的内容。
图1-13 头部内容
在此需要将这部分内容改为公司的名称或者项目的名称,注意,在Xcode 3.2.x之前,需要命令行设置变量。之后就可以通过Xcode的配置项进行操作了,操作步骤分别如图1-14和图1-15所示。
图1-14 选择“Edit Project Settings”选项
图1-15 设置显示的内容
这样如果再创建文件,就会产生如图1-16所示的效果了。
图1-16 创建文件时自动生成的内容
1.3.2 通过搜索框缩小文件范围
当项目开发一段时间后,源代码文件会越来越多。再从Groups & Files的界面去点选,效率比较差。可以借助Xcode的浏览器窗口,如图1-17所示。
图1-17 Xcode的浏览器窗口
在图 1-17 所示的搜索框中可以输入关键字,这样浏览器窗口里只显示带关键字的文件了,如只想看Book相关的类,如图1-18所示。
图1-18 输入关键字
1.3.3 格式化代码
例如,在图1-19所示的界面中,有很多行都顶格了,此时需要进行格式化处理。
图1-19 多行都顶格
选中需要格式化的代码,然后在上下文菜单中进行查找,这是比较规矩的办法,如图 1-20所示。
图1-20 在上下文菜单中进行查找
Xcode没有提供快捷键,当然自己可以设置。我就比较喜欢用快捷键。我的做法是:Ctrl+A(全选文字)、Ctrl+X(剪切文字)、Ctrl+V(粘贴文字)。Xcode会对粘贴的文字格式化。
1.3.4 代码缩进和自动完成
有的时候代码需要缩进,有的时候又要做相反的操作。单行缩进和其他编辑器类似,只需使用Tab 键即可。如果选中多行则需要使用快捷键,其中 Command+]表示缩进,Command+[表示反向缩进。
使用IDE工具的一大好处是,这一工具能够帮助我们自动补全冗长的类型名称。Xcode提供了这方面的功能。比如下面的输出日志:
NSLog(@"book author: %@",book.author);
如果都自己输入会很麻烦,可以先输入ns,然后使用快捷键“Ctrl+.”,会自动出现如下代码:
NSLog(NSString * format)
然后填写参数即可。快捷键“Ctrl+.”的功能是自动给出第一个匹配ns关键字的函数或类型,而NSLog是第一个。如果继续使用“Ctrl+.”,则会出现比如NSString的形式。以此类推,会显示所有ns开头的类型或函数,并循环往复。或者,也可以用“Ctrl+,”快捷键,比如还是ns,那么会显示全部 ns 开头的类型、函数、常量等的列表。可以在这里选择。其实,Xcode 也可以在输入代码的过程中自动给出建议。比如要输入NSString。当输入到NSStr的时候:
NSString
此时后面的ing会自动出现,如果和我预想的一样,只需直接按Tab键确认即可。也许你想输入的是NSStream,那么可以继续输入。另外也可输入Esc键,这时就会出现结果列表供选择了,如图1-21所示。
图1-21 出现结果列表
如果是正在输入方法,那么会自动完成如图1-22所示的样子。
图1-22 自动完成的结果
我们可以使用Tab键确认方法中的内容,或者通过快捷键“Ctrl+/”在方法中的参数间来回切换。
1.3.5 文件内查找和替换
在编辑代码的过程中经常会做查找和替换的操作,如果只是查找则直接按“Command+F”组合键即可,在代码的右上角会出现如图1-23所示的对话框。只需在里面输入关键字,不论大小写,代码中所有命中的文字都会高亮显示。
图1-23 查找界面
也可以实现更复杂的查找,比如是否区分大小写、是否使用正则表达式等,设置界面如图1-24所示。
图1-24 复杂查找设置
通过图1-25中的“Find & Replace”可以切换到替换界面。
图1-25 “Find & Replace”替换
例如图1-26所示的界面将查找设置为区分大小写,然后替换为myBook。
图1-26 替代为myBook
另外,也可以单击按钮决定是否全部替换,还是查找一个替换一个等。如果需要在整个项目内查找和替换,则依次单击“Edit”→“Find”→“Find in Project…”命令,如图1-27所示。
图1-27 “Find in Project…”命令
还是以找关键字book为例,则实现界面如图1-28所示。
图1-28 在整个项目内查找“book”关键字
替换操作的过程也与之类似,在此不再进行详细讲解。
1.3.6 快速定位到代码行
如果想定位光标到选中文件的行上,可以使用快捷键“Command+L”来实现,也可以依次单击“Edit”→“Go to Line”命令实现,如图1-29所示。
图1-29 “Go to Line”命令
在使用菜单或者快捷键时都会出现图 1-30 所示的对话框,输入行号和回车后就会来到该文件的指定行。
图1-30 输入行号
1.3.7 快速打开文件
有时候需要快速打开头文件,例如图 1-31 所示的界面。要想知道这里的文件 Cocoa.h 到底是什么内容,可以用鼠标光标选中文件Cocoa.h来实现。
图1-31 一个头文件
依次单击“File”→“Open Quickly…”命令,如图1-32所示。
图1-32 “Open Quickly…”命令
此时会弹出如图1-33所示的对话框。
图1-33 “Open Quickly…”对话框
此时双击文件Cocoa.h的条目就可以看到如图1-34所示的界面。
图1-34 文件Cocoa.h的内容
1.3.8 使用书签
使用Eclipse的用户会经常用到TODO标签,比如正在编写代码的时候需要做其他事情,或者提醒自己以后再实现的功能时,可以写一个TODO注释,这样可以在Eclipse的视图中找到,方便以后找到这个代码并修改。其实Xcode也有类似的功能,比如存在一段如图1-35所示的代码。
图1-35 一段代码
这段代码的方法printInfomation是空的,暂时不需要具体实现。但是需要记下来,便于以后能找到并补充。那么让光标在方法内部,然后单击鼠标右键,在弹出的菜单中选择“Add to Bookmarks”命令,如图1-36所示。
图1-36 选择“Add to Bookmarks”命令
此时会弹出一个对话框,可以在里面填写标签的内容,如图1-37所示。
图1-37 填写标签的内容
这样就可以在项目的书签节点找到这个条目了,如图 1-38 所示。此时单击该条目,可以回到刚才添加书签时光标的位置。
图1-38 在项目的书签节点找到这个条目
1.3.9 自定义导航条
在代码窗口上边有一个工具条,此工具条提供了很多方便的导航功能,如图1-39所示的功能。
图1-39 一个导航条
它也可以用来实现上面TODO的需求。这里有两种自定义导航条的写法,其中标准写法如下:
#pragma mark
Xcode兼容的格式如下:
// TODO: xxx // FIXME: xxx
完整的代码如图1-40所示。
图1-40 完整的代码
此时会产生如图1-41所示的导航条效果。
图1-41 产生的导航条效果
1.3.10 使用Xcode帮助
如果想快速查看官方API文档,可以在源代码中按下“Option”键并用鼠标双击该类型(函数、变量等),比如图1-42所示的是NSString的API文档对话框。
如果单击图1-42中标识的按钮,会弹出完整文档的窗口,如图1-43所示。
图1-42 NSString的API文档对话框
图1-43 完整文档的窗口
1.3.11 调试代码
最简单的调试方法是通过NSLog 打印出程序运行中的结果,然后根据这些结果判断程序运行的流程和结果值是否符合预期。对于简单的项目,通常使用这种方式就足够了。但是,如果开发的是商业项目,需要借助 Xcode 提供的专门调试工具。所有的编程工具的调试思路都是一样的。首先要在代码中设置断点,此时可以想象一下,程序的执行是顺序的,可能怀疑某个地方的代码出了问题(引发 Bug),那么就在这段代码开始的地方,比如是一个方法的第一行,或者循环的开始部分,设置一个断点。那么程序在调试时会在运行到断点时终止,接下来可以一行一行地执行代码,判断执行顺序是否是自己预期的,或者变量的值是否和自己想的一样。
设置断点的方法非常简单,比如想对红框表示的行设置断点,就单击该行左侧红圈位置,如图1-44所示。
图1-44 单击该行左侧红圈位置
单击后会出现断点标志,如图1-45所示。
图1-45 出现断点标志
然后运行代码,比如使用“Command+Enter”命令,这时将运行代码,并且停止在断点处,如图1-46所示。
图1-46 停止在断点处
可以通过“Shift+Command+Y”命令调出调试对话框,如图1-47所示。
图1-47 调试对话框
这和其他语言IDE工具的界面大同小异,因为都具有类似的功能。下面是主要命令的具体说明。
□ Continue:继续执行程序。
□ step over, step into, step out:用于单步调试,分别表示如下3点说明。
· step over:将执行当前方法内的下一个语句。
· step into:如果当前语句是方法调用,将单步执行当前语句调用方法内部第一行。
· step out:将跳出当前语句所在方法,到方法外的第一行。
通过调试工具,可以对应用做全面和细致的调试。
1.4 启动iOS 8模拟器
Xcode是一款功能全面的应用程序,通过此工具可以轻松输入、编译、调试并执行Swift程序。如果想在Mac上快速开发iOS应用程序,则必须学会使用这个强大的工具的方法。接下来将简单介绍使用 Xcode 编辑启动模拟器的基本方法。
图1-48 Xcode图标
(1)Xcode 位于“Developer”文件夹内中的“Applications”子文件夹中,快捷图标如图 1-48所示。
(2)启动Xcode 6后的初始界面如图1-49所示,在此可以设置创建新工程还是打开一个已存在的工程。
图1-49 启动一个新项目
(3)单击“Create a new Xcode project”后会出现如图1-50所示的窗口。
图1-50 启动一个新项目:选择应用程序类型
(4)在 New Project 窗口的左侧,显示了可供选择的模板类别,因为我们的重点是类别 iOS Application,所以,在此需要确保选择了它。而在右侧显示了当前类别中的模板以及当前选定模板的描述。就这里而言,请单击模板“Empty Application(空应用程序)”,再单击Next(下一步)按钮,窗口界面效果如图1-51所示。
图1-51 单击模板“Empty Application(空应用程序)”
(5)选择模板后单击“Next”按钮,在新界面中,Xcode将要求您指定产品名称和公司标识符。产品名称就是应用程序的名称,而公司标识符是创建应用程序的组织或个人的域名,但按相反的顺序排列。这两者组成了束标识符,它将您的应用程序与其他iOS应用程序区分开来,如图1-52所示。
图1-52 Xcode文件列表窗口
例如我们将创建一个名为“exSwift”的应用程序,设置域名是“apple”。如果没有域名,在开发时可以使用默认的标识符。
(6)单击“Next”按钮,Xcode将要求我们指定项目的存储位置。切换到硬盘中合适的文件夹,确保没有选择复选框Source Control,再单击“Create(创建)”按钮。Xcode将创建一个名称与项目名相同的文件夹,并将所有相关联的模板文件都放到该文件夹中,如图1-53所示。
图1-53 选择保存位置
(7)在Xcode中创建或打开项目后,将出现一个类似于iTunes的窗口,您将使用它来完成所有的工作,从编写代码到设计应用程序界面。如果这是您第一次接触Xcode,令人眼花缭乱的按钮、下拉列表和图标将让您感到恐惧。为让您对这些东西有大致认识,下面首先介绍该界面的主要功能区域,如图1-54所示。
图1-54 Xcode界面
(8)运行iOS模拟器的方法十分简单,只需单击左上角的按钮即可,运行效果如图1-55所示。
图1-55 iOS模拟器的运行效果