在 Swift 中使用编译器变量
Using compiler variables in Swift
在 Objective-C 中,我在构建设置 -> 代码中使用的其他 C 标志中设置了一堆编译器标志。例如:
标志 => -DPortNumber = 1
在代码中我可以通过 @(PortNumber)
访问它
这在 Swift 中不起作用,我找不到答案。
C 编译器的 -D
标志定义了预处理器宏。 Swift 中没有预处理器宏。所以如果你想做这样的事情:
// compile with -DPORT_NUMBER 31337
var port = PORT_NUMBER // error
...你不能。 Swift 旨在让源代码在编译前语法完整。如果您可以在构建时切换出它的块,就会破坏工具链帮助验证您的代码正确性的能力。 (部分原因是 C 中的预处理器宏是文本替换:您可以使用它们重写语言的任何部分,而不仅仅是为变量填充值。)
Swift 编译器确实有一个 -D
标志,但它的使用更受限制:您只能将它用于 build configurations。所以,如果你想做类似下面的事情,你会很酷:
// 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)
之类的东西。)因此,你可以在你的应用程序中包含一个捆绑资源,其内容会在编译时根据你的项目设置,然后从中读取您的端口号。
在 Objective-C 中,我在构建设置 -> 代码中使用的其他 C 标志中设置了一堆编译器标志。例如:
标志 => -DPortNumber = 1
在代码中我可以通过 @(PortNumber)
这在 Swift 中不起作用,我找不到答案。
C 编译器的 -D
标志定义了预处理器宏。 Swift 中没有预处理器宏。所以如果你想做这样的事情:
// compile with -DPORT_NUMBER 31337
var port = PORT_NUMBER // error
...你不能。 Swift 旨在让源代码在编译前语法完整。如果您可以在构建时切换出它的块,就会破坏工具链帮助验证您的代码正确性的能力。 (部分原因是 C 中的预处理器宏是文本替换:您可以使用它们重写语言的任何部分,而不仅仅是为变量填充值。)
Swift 编译器确实有一个 -D
标志,但它的使用更受限制:您只能将它用于 build configurations。所以,如果你想做类似下面的事情,你会很酷:
// 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)
之类的东西。)因此,你可以在你的应用程序中包含一个捆绑资源,其内容会在编译时根据你的项目设置,然后从中读取您的端口号。