将标头导入到swift文件中时,如何为不同的目标定义条件宏?

问题描述 投票:0回答:1

我正在尝试将 Swift 类导入到 Xcode 中的 Objective-C 文件中。它工作得很好,基于将类暴露给 Objective-C 并导入 ProductModuleName-Swift.h Xcode 生成的文件。我遇到的问题是我的应用程序有多个目标,并且 Xcode 似乎为每个目标生成了不同的 -Swift.h 文件。因此,如果我导入生产 -Swift.h,开发目标将不会构建,反之亦然。

我已经尝试过:

- 导入它们:不起作用(由于无法找到另一个,所以都不会构建)

- 添加了条件宏,以便仅为正确的目标导入正确的文件:当包装在条件中时,Xcode 无法再定位该类中的 Swift 方法,并且无法编译。

我当前的解决方案确实有效,涉及进入其中一个目标的构建设置,断开生成的标头名称与产品模块名称的连接,并手动为其指定与另一个目标相同的名称。现在它编译得很好。然而,我担心的是,我正在修改一些不应该改变的东西,并且可能会产生负面影响。

所以我的问题是 - 有没有更好的方法来实现我想要实现的目标?预先感谢。

*LogStatements Swift 类不再找到并且无法编译 ->

 #if PRODUCTION
#import "ProductionTarget-Swift.h"
#elif DEV #import "DevelopmentTarget-Swift.h"
#endif

@implementation STNetworkManager

+ (void)saveDictionary:(NSDictionary *)dictionary withFileName:(NSString *)fileName {

if (dictionary == nil || fileName == nil) {
return;
}
// check if all objects are valid JSON objects

if (![NSJSONSerialization isValidJSONObject:dictionary]) {
NSLog(@"Error saving dictionary, invalid JSON object: %@", dictionary);
LogStatements *logging = [[LogStatements alloc] init]; [logging logger:@[@"Hello from Objective-C"]];
return;
}
swift objective-c xcode macros bridging-header
1个回答
0
投票

Swift 编译器为每个模块生成一个标头。您的不同目标正在创建不同的模块,因此标头最终会具有不同的名称。

目标生成的标头名称位于该目标的构建设置中。它位于

Swift Compiler - General
部分,设置名称为
Generated Header Name

如果您将每个目标的生成标头设置为相同的名称,则可能会解决您的问题。

如果两个目标正在构建相同的“东西” - 相同的模块,您还可以查看目标构建设置的

Packaging
部分并更改目标,以便它们使用相同的
Product Module Name

但是,一般来说,如果您想为调试和发布构建相同的“东西”,您要做的就是设置一个目标,然后您可以使用

product
菜单构建它以进行调试或发布。如果您需要进行更复杂的更改,那么您可以对同一目标制定不同的方案以在调试和发布之间切换。当前方案位于 Xcode 项目磁贴栏中小信息区域的左侧(请参阅https://developer.apple.com/documentation/xcode/build-system 中的图像,其中方案和目标设置被调出)。

© www.soinside.com 2019 - 2024. All rights reserved.