字符串值替代项的Swift编译器宏/标志

字符串值替代项的Swift编译器宏/标志,swift,Swift,在Objective-C中,我们可以添加一个C标志-DVAR\u NAME=@“string value\”,然后使用NSString*var=var\u NAME获取值 我们如何在Swift中做到这一点 这方面的一个例子是基于当前git分支定义api主机。假设分支是feature1,它应该连接到https://feature1.example.com。shell脚本可以很容易地找到当前分支并添加C标志。然后在Objective-C中,我们可以使用shell脚本的分支来生成api主机url 更新

在Objective-C中,我们可以添加一个C标志
-DVAR\u NAME=@“string value\”
,然后使用
NSString*var=var\u NAME
获取值

我们如何在Swift中做到这一点

这方面的一个例子是基于当前git分支定义api主机。假设分支是
feature1
,它应该连接到
https://feature1.example.com
。shell脚本可以很容易地找到当前分支并添加C标志。然后在Objective-C中,我们可以使用shell脚本的分支来生成api主机url

更新

我不是在问布尔标志。我需要传递一个字符串值

更新2

到目前为止,我所能想到的就是使用构建脚本来生成swift类

更新3


另一个选项是向Info.plist添加自定义键。这并不总是一个可接受的解决方案,但对于配置值,这是可行的。

定义如下条件:

var window: UIWindow?

#if MYDEF
  var textureRenderThread : TextureRenderThread?
#endif
在项目->构建设置->Swift编译器->自定义标志中


将“-D MYDEF”设置为“其他Swift标志”的值。他们因为这样的事情被滥用,这不是一个干净的解决方案。您有以下选项(其中一些您已经提到)

  • Info.plist
  • 最简单,易于阅读和编辑。不适合大型配置

  • 你自己的
    .plist
  • 易于阅读和编辑(即使在构建之前使用命令行工具,请参见
    PlistBuddy
    tool)。更适合更大的配置

  • 自动生成的代码
  • 您的代码可以包含易于匹配的表达式,例如

    let myConfigValue = "${MY-CONFIG-VALUE}".
    
    您可以使用命令行工具轻松替换这些值,例如
    sed
    。这基本上是在不使用C预处理器的情况下复制宏。这不是很干净,但是如果您已经有了一个不想更改的构建系统,那么它是可用的

  • 多个代码变体

  • 您可以使用带有配置常量的Swift文件,并使用
    #if
    在它们之间切换。

    Swift不支持宏,因为宏不是一个选项,我们还可以使用什么来硬编码值?@与任何非C语言一样尊重代码配置文件?需要读取配置文件,这需要时间。我们可以读取值并将其缓存在内存中,但这需要内存。这些都不是阻滞剂,但他们需要深思熟虑。配置文件可以工作,但它们并不像编译过程中传递的宏那样干净。@代码干净吗?配置文件更干净。这只给你一个布尔值。是否定义了该标志。回答之前请先阅读问题。我同意宏被滥用的说法。采用Swift的一个好处是,它迫使每个人重新访问旧代码和流程。@尊重代码至于我的建议,我更喜欢一个单独的plist文件。在构建期间更改
    Info.plist
    将反映在版本控制系统中,因此我更喜欢版本控制可以忽略的文件。至于读取配置,可以将其抽象为一个非常简单的类。