一尘不染

在Swift中使用编译器变量

swift

在Objective-C中,我在构建设置->代码中使用的其他C标志中设置了一堆编译器标志。例如:

标志=> -DPortNumber = 1

在代码中,我能够通过 @(PortNumber)

这在Swift中不起作用,而且我找不到答案。


阅读 225

收藏
2020-07-07

共1个答案

一尘不染

-DC编译器的标志定义了预处理器宏。Swift中没有预处理器宏。因此,如果您要执行以下操作:

// compile with -DPORT_NUMBER 31337
var port = PORT_NUMBER    // error

…你不能。Swift旨在使源代码在编译之前在语法上完整。如果您可以在构建时关闭其中的某些块,则可能会破坏工具链的功能,以帮助验证代码是否正确。(部分原因是因为C中的预处理器宏是文本替换的:您可以使用它们来重写语言的任何部分,而不仅仅是填写变量的值。)

Swift编译器确实有一个-D标志,但是其使用受到更多限制:您只能将其用于构建配置。因此,如果您想执行以下操作,那将很酷:

// compile with -DUSE_STAGING_SERVER
#if USE_STAGING_SERVER
var port = 31337
#else
var port = 80
#endif

请注意,与C不同,#if块内的所有内容都必须在语法上完整。(例如,您不能仅将a的声明行func放在#if块中,而将函数主体保留在条件语句之外。)

当然,如果要在代码中使用编译时设置的配置
,这对您没有帮助。为此,我建议使用其他方法。Xcode仍然可以在资源文件(例如属性列表)中进行文本替换。(请注意,应用程序随附的Info.plist充满了诸如之类的东西$(TARGET_NAME)。)因此,您可以在应用程序中包含捆绑资源,其内容将根据项目设置在编译时填充,然后读取端口从那开始

2020-07-07