在Swift中使用编译器变量

时间:2015-01-06 17:48:37

标签: swift compiler-flags

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

Flag => -DPortNumber = 1

在代码中,我可以通过@(PortNumber)

访问它

这在Swift中无效,我无法找到答案。

1 个答案:

答案 0 :(得分:12)

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)等内容。)因此,您可以在应用程序中包含一个包资源,其内容在编译时根据您的项目设置进行填充,然后从那里读取你的端口号。