Xcode,是否可以在构建时拦截和更改代码而不更新文件?如果是这样,怎么办?

标签 xcode build scripting compilation

我需要一种方法在代码进入编译器之前拦截代码,对其进行更改,并使其在文件/Xcode 中保持不变。

我认为构建脚本是一种流拦截,但事实似乎并非如此。另一种方法可能是在构建之前和之后运行脚本。我应该注意这是否有任何影响?

-----编辑-----

为什么?我有一个基于特定注释语法的自动记录系统的想法。我希望能够在构建时解析某个字符串并将其替换为日志记录函数,但代码保持不变。可能吗?

-----更新-----

看来自定义编译器可能是前进的方向,或者至少是一个包装当前 LLVM clang 的插件。我一直在调查此事。对于感兴趣的人来说,这是一个相关问题:Xcode custom compiler which wraps and does a passthru to clang

最佳答案

如果“构建时”是指在实际编译代码之前,则意味着每次要运行脚本时都需要打开 Xcode。我不相信有办法做到这一点。但是,您可以在运行代码之前使用 Automator 接收字符串,但您需要使用 Automator 来构建应用程序,这是有限制的。另一种方法是在您的应用程序中创建 2 个类:预运行类和主类。预运行类将提示用户或读取文件(或类似的东西)来获取字符串,并根据字符串以特殊方式运行主类。

编辑:回复评论

我不知道如何在 Objective-C 中执行此操作,但您始终可以将主文件重命名为 main.mm(.mm 文件包含 C++ 和 Objective-C 代码)并向其中添加 C++ 代码。但是,这是使用控制台:

using namespace std // all  (this line is optional)
string s = ""; //      this
cin >> s; //           is C++  (if you omitted the optional line above, the correct code is std::cin >> s;
MainClass mc = //constructor for your "main class" here in Objective-C
if(s == someCertainString){ //hypothetical string and C++ condition checking for a C++ string
    [mc doThisACertainWay:];
}else if(s == someOtherString){ // again, hypothetical string that you need to declare
    [mc doThisADifferentWay];
}

我现在不在电脑上,所以无法检查代码,但您可以搜索如何用 C++ 和 Obj-C 读写文件。我现在能给出的唯一提示是你需要 #include <iostream>如果您使用 C++ 读/写文件,则在开头。

如果您不想使用控制台(如果您想发布此内容,这是正常的),您也可以创建一个对话框。在此示例中,您不需要 C++,因此无需重命名主文件。创建一个在启动时可见的新窗口(从现在开始称为theDialog),并确保您的主图形界面在启动时不会显示。将文本字段添加到 theDialog并为其命名(在本例中为 tf )。添加标签来告诉用户要在文本字段中输入什么内容。添加一个按钮并将其链接到一个操作。在此操作中,输入以下代码:

MainClass mc = // constructor here
NSString *str = [self.tf stringValue];
if([str equalsString:someString]){ // hypothetical string and possible error in the condition checking, I'm new to Obj-C
    [mc doThisInACertainWay];
} else {
    [mc doThisInADifferentWay];
}

关于Xcode,是否可以在构建时拦截和更改代码而不更新文件?如果是这样,怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19068830/

相关文章:

linux - Linux shell 脚本执行时等待消息

Vim 寄存器在 Ex 模式下的使用

iphone - Xcode 中的 TDD 工作流 - 在进行红绿重构时如何为 "quick fix"?

string - 如何通过可选复选框将字符串参数添加到Jenkins

ios - swift 索引路径=可选(0)

android - Qt Creator中Android项目编译报错 "cannot find -lc++"如何解决?

android - targetSdkVersion 和项目构建目标之间的区别

linux - 无法在 case 语句 bash 中设置变量

ios - NavigationView 在纵向模式下消失

iphone - 更改图标/产品名称和图像 iPhone