在Objective-C中,我在构建设置->代码中使用的其他C标志中设置了一堆编译器标志。例如:
标志=> -DPortNumber = 1
在代码中,我能够通过 @(PortNumber)
@(PortNumber)
这在Swift中不起作用,而且我找不到答案。
-DC编译器的标志定义了预处理器宏。Swift中没有预处理器宏。因此,如果您要执行以下操作:
-D
// 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块中,而将函数主体保留在条件语句之外。)
#if
func
当然,如果要在代码中使用编译时设置的配置 值 ,这对您没有帮助。为此,我建议使用其他方法。Xcode仍然可以在资源文件(例如属性列表)中进行文本替换。(请注意,应用程序随附的Info.plist充满了诸如之类的东西$(TARGET_NAME)。)因此,您可以在应用程序中包含捆绑资源,其内容将根据项目设置在编译时填充,然后读取端口从那开始
$(TARGET_NAME)