在Objective-C中,我在Build Settings中设置了一堆编译器标志 ->代码中使用的其他C标志。例如:
标志 => -DPortNumber = 1
在代码中,我能够通过@(PortNumber)
访问它
这在 Swift 中不起作用,我找不到答案。
编译器的 -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)
之类的内容,例如。因此,您可以在应用程序中包含一个捆绑资源,其内容在编译时根据您的项目设置填充,然后从中读取您的端口号。