字符串值替代项的Swift编译器宏/标志
在Objective-C中,我们可以添加一个C标志字符串值替代项的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 更新
-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标志”的值。他们因为这样的事情被滥用,这不是一个干净的解决方案。您有以下选项(其中一些您已经提到)
.plist
PlistBuddy
tool)。更适合更大的配置
let myConfigValue = "${MY-CONFIG-VALUE}".
您可以使用命令行工具轻松替换这些值,例如sed
。这基本上是在不使用C预处理器的情况下复制宏。这不是很干净,但是如果您已经有了一个不想更改的构建系统,那么它是可用的
您可以使用带有配置常量的Swift文件,并使用
#if
在它们之间切换。Swift不支持宏,因为宏不是一个选项,我们还可以使用什么来硬编码值?@与任何非C语言一样尊重代码配置文件?需要读取配置文件,这需要时间。我们可以读取值并将其缓存在内存中,但这需要内存。这些都不是阻滞剂,但他们需要深思熟虑。配置文件可以工作,但它们并不像编译过程中传递的宏那样干净。@代码干净吗?配置文件更干净。这只给你一个布尔值。是否定义了该标志。回答之前请先阅读问题。我同意宏被滥用的说法。采用Swift的一个好处是,它迫使每个人重新访问旧代码和流程。@尊重代码至于我的建议,我更喜欢一个单独的plist文件。在构建期间更改Info.plist
将反映在版本控制系统中,因此我更喜欢版本控制可以忽略的文件。至于读取配置,可以将其抽象为一个非常简单的类。