Swift中的import语句是否有相关的成本?

Fer*_*rdz 6 ios swift swift4

阅读String Manifesto,我看到一段关于Foundation在没有必要时避免导入的段落.

为什么这对Swift团队来说是一个问题?除了美学和代码整洁,进口是否需要付出代价?

导入不必要的框架会影响性能,内存使用,打包的应用程序大小或构建时间吗?

Doe*_*ata 6

您引用的页面只是说他们希望看到更多直接构建在Swift中的String方法.目前,一些像区分大小写的字符串比较等任务需要导入Foundation.

好的,我将把你的问题的其余部分给出一个机会.答案是它取决于您导入的内容.

看看这个答案:

从Xcode 5开始,有一项新功能引入了预编译源数据库.Xcode 5基本上只编译了所有必需的框架,在数据库中保存了构建,并且在编译代码时已编译的部分使用了

还看这个问题:

我们看到UIKit在每个使用它的文件中导入都是必要的.如果上述解决方案是正确的,无论多少次UIKitFoundation导入,它只编译一次.因此,多次导入标准库不会影响编译时间.

但是,第一次导入内容会影响编译时间,因为现在需要在以前不需要时编译该库.

例如,如果我必须在一个小的Swift程序中导入Foundation,编译时间将会减慢.说到iOS应用程序,基本上不可能不导入也导入基金会的UIKit,所以我认为这不值得担心,因为每个应用程序也必须编译这些库.

另外,我们需要查看Cocoa PodsCarthage之类的导入:

看看这个回购:

您可以通过两种方式在项目中嵌入第三方依赖项:

每次执行项目的干净构建时(例如:CocoaPods,git子模块,复制粘贴代码,应用程序目标所依赖的子项目中的内部库)作为预构建框架/库(示例:Carthage )编译的源代码 ,由不想提供源代码的供应商分发的静态库) CocoaPods是iOS设计中最受欢迎的依赖管理器,导致编译时间更长,因为大多数情况下第三方库的源代码都被编译你执行一个干净的构建时间.一般来说,你不应该经常这样做,但实际上,你做(例如因为切换分支,Xcode错误等).

迦太基,即使它更难使用,如果你关心构建时间,它是更好的选择.只有在依赖项列表中更改某些内容(添加新框架,将框架更新到更新版本等)时,才构建外部依赖项.这可能需要5或15分钟才能完成,但与构建嵌入CocoaPods的代码相比,这样做的频率要低得多.

看看这个博客:

我们看到,如果关注编译时间,可以使用更精确的导入.如import UIKit.UITableViewController

就性能和二进制大小而言,Swift编译器已经在最终二进制文件中优化了任何未使用的符号.如果在编译时没有引用它,则将其删除,这意味着导入框架但不使用它的特定部分不应该有任何负面影响.

另一篇博客指出:

在本次WWDC 2016演讲中,Apple建议用静态存档替换动态框架以缓解这种情况.为了采用这种方法,我们尽可能静态地重建了许多动态框架,然后将它们合并为一个名为AutomaticCore的单一动态框架.

差异是戏剧性的:我们的应用程序的发布时间缩短了一半.

TLDR:不值得担心导入像Foundation或UIKit这样的标准内容,它们只编译一次,几乎每个应用程序都使用它们,因此共享任何性能降低.但是,如果要导入第三方框架,则可能需要使用静态存档来帮助编译时.