在Xcode中使用Swift的预处理宏

3
我在尝试使用Swift复制ObjC提供的预处理宏功能时遇到了问题。我听说Swift没有预处理器,因此我正在寻找另一种实现方式。
我的最终目标是使用命令行工具构建项目,并传递自定义变量和值,这些变量和值将在构建之前预处理并插入到特定位置的代码中。
以下是ObjC的解决方案:
使用此命令运行测试:
xcodebuild \
    test \
    -scheme TestUserDefinedVariablesObjC \
    -destination 'platform=iOS Simulator,name=iPhone 6' \
    MY_VAR=42

我在代码中使用 MY_VAR,例如:

int a = MY_VAR;

我在目标的构建设置中像这样将MY_VAR添加到预处理器宏中:MY_VAR=$(MY_VAR)

如果万不得已,我可以在方案的运行阶段添加预操作,使用sed或类似工具替换正确的值,但这并不是一个好的解决方案。


可能是重复的问题:Swift: iOS Deployment Target Command Line Flag - David Berry
@David 我想从命令行传递一个_variable_到应用程序,而不是一个常数。 - paulvs
一样的区别。在Xcode中,将其设置为MY_VAR = $(MY_VAR)。 - David Berry
我阅读了相关问题,但它并没有展示如何在Swift中访问它。 - paulvs
1
我正在寻找一种检索值的方法。我尝试在其他Swift标志中使用MY_VAR = $(MY_VAR),但是使用int a = MY_VAR;会产生“未解决的标识符'MY_VAR'”错误。 - paulvs
2个回答

0

在构建阶段脚本中,您可以使用clang预处理器而不是SED。例如,将以下内容放入名为macro-test.c的文件中。

#if DEBUG
#define LOG(A) print(A)
#else
#define LOG(A) 
#endif

import Foundation

func hello()
{
    LOG("Hello, Swift macro!")
    
    let theAnswer = MY_CONST
    
    print("The answer = ", theAnswer)
}

添加一个脚本构建阶段,运行clang预处理器:
#!/bin/sh
if [ $CONFIGURATION == "Debug" ] ;
then
    DEBUG="1"
else
    DEBUG="0"
fi
MY_CONST=42

clang -E -P -DMY_CONST=$MY_CONST -DOS=$OS -DDEBUG=$DEBUG "${SOURCE_ROOT}/macro-test.c" > "${SOURCE_ROOT}/macro-test.swift"

将生成的 Swift 文件添加到 Xcode 项目中。

0

你是否使用了不同的键盘或按键集?如果是,请检查 "

例如: 在我的目标构建设置中的预处理器宏 MY_VAR=\"42\"

检查 " 字符。将其更改为此 "


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接