无论是在Xcode项目还是Playground里,我们在开始都会看到下面的代码:
import UIKit
然而import究竟意味着什么?为什么要这样做?我们通过这段视频向大家介绍Swift模块管理机制。理解它们,我们才能更好的在项目中集成各种第三方框架。
从TARGET和SCHEME说起
如果我们点击"AlamofireDemo"或者"Pods",就可以看到每个项目的TARGETS。

简单来说,一个TAGET可以表示项目最终生成的可执行程序(AlamoFireDemo.app),也可以表示一个可被重用的Library(*.framework)。当我们通过Command+B构建整个项目的时候,这些TARGETS就会按照"既定"的规则被构建出来,我们点击Command+8,打开"Report Navigator",就可以看到Xcode每一次的构建过程。点击其中一个Build,就可以看到我们项目中被构建出来的三个TARGETS:

在Alamofire这个target被构建的过程中,我们可以看到从预处理、编译、拷贝文件到链接第三方库,生成一个app文件Xcode为我们做了很多工作。我们可以把这些工作理解为定义Xcode行为的"配置文件"或"工作守则",每当Command + B被按下的时候,Xcode就按照这份"守则"去工作。在Xcode里,我们管这样的守则就叫做SCHEME。在Toolbar里,点击项目名,选择"Manage schemes...":

就可以打开Scheme管理界面了:

这里,由于我们的Workspace有三个targets,所以必然至少会有三个用于生成这三个targets的schemes。选择AlamoFireDemo,然后,点击"Edit..."按钮。这时,我们就可以看到SCHEME中定义的各种详细的工作守则,包括我们对项目执行Build、Run、Test、Profile、Analyze、Archive的时候,Xcode要执行的各种操作。例如,我们选择Run:

在这里,可以看到当我们执行:Build for running...时,Xcode要执行的详细工作清单。例如:用什么配置构建app、带有哪些启动参数和环境变量、有哪些启动选项以及开启哪些运行时分析等。如果我们希望把不同的构建方式保存起来,就可以在Scheme manage界面选择一个Scheme,然后点击下面的"齿轮"图标,选择"Duplicate":

然后,在弹出的界面中,给新的scheme设置一个名字,并且做一些我们需要的配置:

这样,当我们点击"Manage Schemes..."回到Scheme列表的时候,就可以发现多了一个Scheme。我们就可以在Xcode toolbar中,选择用这个Scheme来构建TARGET了。

那么什么是Swift Module?
理解了Target之后,理解Swift module就很容易了。项目中的每一个TARGET(无论是framework还是app),就叫做一个Swift Module。这是Swift分发代码的方式,我们通过import命令,来使用定义在其它Module中的代码。而每一个Module意味着:
- 一个和Module同名的名字空间;
- 一个独立的访问控制范围;
对于第一条来说,这也就是为什么在一个项目中,定义在不同Swift文件中的类型可以在不同的文件中直接使用而不需要include的原因了,因为它们本身就在同一个namespace里。
对于第二条来说,当我们通过import在项目中引入一个module时,就相当于打开了这个module对应的名字空间,进而可以使用这个module中所有标记为public的代码了。
网友评论