在 Swift 中使用编译器变量

问题描述 投票:0回答:1

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

标志 => -DPortNumber = 1

在代码中我可以通过

@(PortNumber)

访问它

这在 Swift 中不起作用,我无法找到答案。

swift compiler-flags
1个回答
16
投票

C 编译器的

-D
标志定义了一个预处理器宏。 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
块内的所有内容都需要在语法上完整。 (例如,您不能仅将
func
的声明行放在
#if
块中,而将函数体留在条件语句之外。)

当然,如果您想在代码中使用在编译时设置的配置value,这对您没有帮助。为此,我建议采用替代方法。 Xcode 仍然可以在资源文件中进行文本替换,例如属性列表。 (请注意,您的应用程序附带的 Info.plist 充满了诸如

$(TARGET_NAME)
之类的内容。)因此,您可以在应用程序中包含一个捆绑资源,其内容在编译时根据您的项目设置进行填充,然后从中读取您的端口号。

© www.soinside.com 2019 - 2024. All rights reserved.