在 Swift 中使用编译器变量



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

标志 => -DPortNumber = 1

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

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

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块中,而将函数体保留在条件之外。

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

最新更新