1.2 起步
此时,最重要的假设是你已经具有一台Mac计算机,如果没有它,将不能安装Xcode,它是Apple的Mac和iOS集成开发环境(Integrated Development Environment,IDE)。
注意:下载Xcode
Xcode 7是从Mac App Store免费下载的,必须具有Mac OS X 10.10.4或更高版本。尽管可以在Xcode 6.x中编写Swift代码,但是本书还将包括Swift版本2.0,它需要Xcode 7。
在Mac上启动App Store应用,搜索Xcode,然后单击安装软件。一旦安装完成,Xcode就会列在/Applications目录中。
1.2.1 四处看看
在打开Xcode时,可能会询问你是否想安装额外的工具;继续前进并安装它们。应该只有在第一次启动Xcode时才会发生这种情况。一旦打开了Xcode,就会看到一个标准的菜单窗口,其中有一些选项,用于创建playground、创建新项目或者打开现有的项目,右边是最近的项目和打开的playground(如果打开了任何playground)的列表。窗口现在应该如图1.1所示。
尽管在本书中主要在playground中工作,但是熟悉一下IDE是有好处的,因此就让我们快速完成这个任务。单击Create a New Xcode Project,创建一个新的Xcode项目。下一个界面询问你想要创建的项目类型,对于这个试验,仅须使用Single View Application,如图1.2所示,然后单击Next按钮。
接下来,将要求命名项目。选择Organization Name、Identifier、Language(Swift或Objective-C)以及要运行项目的设备。这里还可以指示是否想要使用Core Data,或者包括Unit Tests和UI Tests,如图1.3所示。所有这些信息对于你将来创建的项目都是有用的,但是出于测试目的,我们还不需要关心它们,可以使这些复选框保持原样。Organization Identifier通常是个人或公司URL的反向DNS名称,用于在组织级确保唯一性。Bundle Identifier把Project Name附加到Organization Identifier末尾,用于确保每个应用包的唯一性。一旦把应用提交给Mac App Store或iOS App Store,包标识符就需要是唯一的。
在这里,还可以选择设备类型,比如iPhone或iPad,以便于Xcode可以正确地创建设备所需的故事板(Storyboard)文件,这些设备将使用你计划编写的应用。这样,就可以把不同设备上的不同接口作为目标,但是仍然使用相同的代码管理它们,比如利用Universal应用。
把项目命名为TestApp,因为我们只想熟悉Xcode(可以在以后删除这个项目)。一般来说,如果选择不含空格的项目名称,后面就可能遇到更少的麻烦。对于Language选择Swift,并单击Next按钮。Xcode将会打开,并且可以看到你创建的新项目。它应该如图1.4所示。
图1.4 初始的Xcode IDE布局。左边是导航窗格(Navigation Pane),右边是检查器窗格(Inspector Pane),中间是主要内容区。顶部工具栏中是一些按钮,用于运行或停止生成,查看错误和警告信息,以及显示或隐藏视图
Xcode被漂亮地划分成几个合乎逻辑的区域,就像在其他IDE中你可能所习惯的那样。不过,它还有一些非常好的特性要注意。左边的窗格称为导航窗格。在这里,可以选择不同的导航器,查看项目中的文件、警告和错误、断点、单元测试(Unit Test)等。右边的窗格称为检查器窗格,这个动态窗格依赖于单击的是什么元素而改变,比如编辑所选按钮的文本属性,或者在窗口中调整控件的位置。
在处理实际的Mac/iOS项目时,将把大多数时间花在中间的主要内容区中。在内容区中,可以更改项目设置,最重要的是,通过编写代码或者在Storyboard(故事板)中设计界面来创建应用。
左上方的栏中提供了几个有用的功能。从左边起,具有用于窗口管理的标准Mac Red/Yellow/Green(红/黄/绿)按钮。接下来,当涉及编译、生成以及在仿真器(Simulator)或设备上运行你的应用时,播放和停止按钮将实际地生成以及运行和停止。右边用于通知当前的信息,比如项目中有多少个警告或错误,以及生成状态。
最后,右上方的按钮组可以调整你查看的视图,以显示或隐藏导航窗格、检查器窗格、调试窗格(Debug Pane)或辅助编辑器,以及查看代码比较、源代码“查错”视图和日志。
注意:查看两个文件
Assistant Editor(辅助编辑器)把内容区分成两半,以便可以同时查看两个文件。这是有益的,例如,当你可能在编写单元测试以及使单元测试通过的代码时,或者当你在故事板中创建用户界面并且打开了相应的视图控制器(View Controller)以连接动作(Action)和出口(Outlet)时。有关利用自定义界面开发应用的更多知识,建议阅读John Ray的图书Sams Teach Yourself iOS Application Development in 24 Hours(Sams Publishing出版)。
1.2.2 Xcode playground
Xcode的优秀的主要特性之一是playground。playground是一个便笺本,如果你愿意,在把代码添加到应用之前,可以使用它测试代码,以确保你从代码段接收到正确的结果。playground的这种功能如此强大,如果你的代码将给你提供期望的结果,那么就可以获得立即的反馈,而不必编译代码并在仿真器或设备上运行它。
可以随时创建新的playground,并且可以选择使之成为项目的一部分,或者只是作为一个独立的playground文件。由于我们已经位于一个打开的项目中,因此可以单击File→New→ File,然后在文件的Source(源)集(用于iOS或Mac)中选择playground,接着单击Next按钮。在Save As对话框中,命名playground文件(出于我们的目的,名称MyPlayground就很好),然后单击Create按钮。目前不用关心Group或Target;我们还没有生成应用,因此不用关心它们。
注意:Mac或iOS playground
在从Mac区域或iOS区域创建playground时,文件结构中存在一些区别。创建一个Mac playground将会在文件的顶部添加import Cocoa语句,并且使Mac框架和模块可供使用。创建一个iOS playground将在文件的顶部添加import UIKit语句,并且使iOS框架和模块可供使用。初看上去,两种playground并没有什么区别。如果创建iOS playground,但是不想测试Mac应用代码,或者刚好相反,则只需创建一个期望类型的新playground即可。
注意,新的playground带有几行Swift代码,以便于你学习。在继续学习后面的内容之前,让我们先介绍其中一些基础知识。playground应该如下所示。
//: Playground - noun: a place where people can play
import UIKit
var str = "Hello, playground"
上面代码中的第一行是注释,它会被编译器忽略。可以使用注释给代码的某些部分加注解,使得人类能够轻松地读懂它们,也许是给其他同事(或者甚至是你自己)解释代码的这个特定部分是用于什么的。//(双正斜框)意指将把行中余下的内容视作注释。还可以注释整个代码区域或文本段落,它们可以在同一行或者多个连续的行上,只须利用/和/括住它们即可。Swift甚至允许在注释块内嵌套注释块,比如/ ... / ... / ... /。
上述代码中的余下部分执行一个简单的任务,它把字符串"Hello, playground"分配给变量str。即使代码没有直接把任何内容输出到控制台,playground默认也会在playground的结果窗格中显示“Hello, playground”,以显示变量以及你创建的任何后续变量或常量的内容。当你想测试逻辑、数学及其他操作时,这将很方便。
还值得指出的是:变量str前面带有关键字var。var关键字可以让Swift知道str是一个变量,可以更改其内容。要创建常量或者可变的变量,可以使用关键字let代替var。
TRYITYOURSELF
在playground中创建前几行Swift代码
此时,当你身处playground中时,试验前几行代码是有意义的,因此让我们在这里全部试验一下它们。
(1)在playground中,把以下代码输入到一个新行上。
let myNewValue = 40 + 2
(2)注意playground的右边显示“42”。输入如下代码行,以在句子里面插入值。
print("My new value is \(myNewValue).")
(3)要在控制台中查看输出结果,可以单击View菜单,然后单击Debug Area,再单击Show Debug Area。Debug Area在界面底部现在是可见的,并且你应该会看到print()语句的输出。
"My new value is 42."
祝贺!你已经编写了前几行Swift代码。
在上面的“TRY IT YOURSELF”示例中,在第(1)步中把值42赋予myNewValue。然后,在第(2)步中,使用称为字符串插值(string interpolation)的方法,把该值插入一个句子里,这是一种在输出内插入变量或常量的便捷方式。下一章将更详细地讨论字符串插值。print()语句把输出结果显示到控制台,这对于快速调试或者查看数据的内容很方便。
注意:删除Xcode项目
如果你想要删除这个Xcode项目(或者你可能不再想要的任何Xcode项目),可以简单地在文件系统上删除包含文件夹。假如你把这个项目保存在~/Documents/TestApp中,那么只须从Documents目录中删除TestApp文件夹即可。
1.2.3 Swift REPL
Swift还具备一个称为REPL(Read-Eval-Print-Loop,读取-求值-输出-循环)的优秀特性。REPL是我们刚才体验的playground的一个基于命令行的交互式版本。REPL非常适合于快速测试,以确保代码按预期的那样工作,类似于利用playground所得到的结果,但它不会在项目中创建一个新文件,只能把这个临时性的REPL用于进入、测试代码和离开。至于是使用playground还是使用REPL,主要依赖于你更偏爱哪个工具。如果你已经在使用Terminal.app,或者一些其他的命令行实用程序,只打开REPL对你来说可能更容易。另一方面,如果你已经身处Xcode中,那么只创建一个playground并从那里开始可能更快速。
要访问REPL,只须输入以下代码。
$> xcrun swift
xcrun是由Xcode提供的一个命令行工具,用于运行或定位开发工具或属性。因此,上面的代码行用于告诉xcrun运行Swift REPL。当按Return键时,将会看到如下所示的内容(你的版本号可能有所不同)。
Welcome to Apple Swift version 2.0 (700.0.57 700.0.72). Type :help for assistance.
1>
1>是Swift REPL提示符,可在此处开始输入Swift代码,每行一条指令,并且它会为你解释你的代码,与playground所做的非常像。让我们试试另一个编写代码的示例,这一次是在Swift REPL中进行。
TRYITYOURSELF
使用Swift REPL把两个字符串结合在一起
让我们在这里编写另一个包含一些Swift代码的示例;希望这个示例仍然不太难。如果你没有完全理解它,也不要担心;下一章将非常详细地介绍它。
(1)在Mac上打开Terminal.app。
(2)在Terminal中输入xcrun swift,然后按Return键。
(3)在1>提示符下,输入以下代码。
let firstHalf = "I’m writing Swift code,"
let secondHalf = "and I’m so excited!"
let combined = firstHalf + secondHalf
(4)注意每次按Return键时,Swift的REPL如何显示我们使用的常量或变量的名称、它的数据类型String(第2章将介绍数据类型)以及它的值。
(5)看看如何使用“+”运算符把两个字符串连接在一起。Swift足够智能,知道即使我们处理的是字母字符(不同于数字相加),“+”运算符也会把String实例相加起来。第3章将介绍关于运算符的更多知识。
你干得很棒!Swift REPL将在REPL会话期间把常量和变量一直保存在内存中。这意味着以后可以多次引用变量和常量,在实际的应用中编写代码之前,这将可以帮助你致力于快速、轻松地处理问题。完整的“TRY IT YOURSELF”示例应该如图1.5所示。
要退出Swift REPL,可以输入冒号(:)调用命令模式,然后输入q用于退出,并按Return键。这将返回常规的UNIX shell提示符。