我有一个框架目标,其中包含 Objective-C 和 Swift 源文件的混合体。
我刚刚将项目的构建设置升级为 Xcode 14.3.1 推荐的设置。
Xcode 所做的更改之一是为我的框架目标打开
ENABLE_MODULE_VERIFIER
构建设置。
此次升级之后,我在框架的所有公共头文件中收到以下构建错误,其中包含语义导入(即
@import MODULE_NAME;
形式的导入):
不鼓励在框架标头中使用“@import”,包括此标头需要 -fmodules
我在 Xcode > 构建系统 > 识别和解决框架模块问题 文章中也看到了这个建议:
避免在公共和私有标头中使用语义导入语法。
Xcode 构建错误和文章都没有解释为什么我们应该避免在框架的公共和私有头文件中进行语义导入。
为什么我们应该避免在框架的公共和私有头文件中进行语义导入?
Apple 在 Xcode 11.4(该版本使其成为默认警告)的发行说明中声明的原因是“不鼓励在框架标头中使用 @import,因为这样做需要所有导入程序都使用模块。”
换句话说,使用它会强制建立依赖关系,而不是普通的
import
语句,其中预处理器仅包含另一个文件的必要方面。
以下是苹果不鼓励使用它的几个原因:
编译时间较慢:当您在框架标头中使用@import时,可能会导致编译时间变慢,尤其是在大型代码库中。 @import生成的模块接口包含很多不必要的信息,编译器必须处理所有这些信息。这会减慢构建过程。
增加耦合:使用@import可以在模块之间创建紧密耦合。当您在头文件中使用 @import 导入框架时,您将向客户端代码公开该框架的所有实现细节。这可能会导致意外的依赖关系,并使维护和发展代码库变得更加困难。
代码隔离的困难:框架应该为其客户端提供清晰、隔离的API。使用 @import 可能会泄漏实现细节并暴露应保持私有的符号。当您想要在不破坏客户端代码的情况下更改框架的内部结构时,这可能会导致问题。