在桥接头文件中包含-Swift.h

11
我有一个混合的Swift和Objective-C项目。要在Objective-C中访问Swift公共API,API使用者目前必须导入"MyModule-Swift.h"。我已经有了一个名为"MyModule.h"的Objective-C总头文件。但是,导入"MyModule.h"对于Swift API来说不起作用。我尝试在总头文件中导入"MyModule-Swift.h",但它找不到它(我假设这是因为它是由Xcode动态生成的)。如果有任何建议,使API使用者始终可以导入"MyModule.h"来使用用Swift/Objective-C编写的公共API,那将非常感激。

====================================================================

编辑: 我很抱歉没有花时间来正确地提出问题。我有一个名为MyModule的框架。

我有一个 Objective-C 类叫做ABUser,

@interface ABUser: NSObject

- (void)walk;

@end

我想使用 Swift 给这个类添加新的行为,因此我定义了一个扩展。
extension ABUser {

func swiftWalk()

}

现在,假设我想从Objective-C应用程序中访问在ABUser上定义的swiftWalk方法,我需要导入#import <MyModule/MyModule-Swift.h>。如果我想使用walk方法,导入#import <MyModule/MyModule.h>即可。这是在假设伞头文件MyModule.h导入了ABUser.h的情况下。我希望Objective-C应用程序只需要导入#import <MyModule/MyModule.h>,无需担心API是在框架中用Objective-C还是Swift编写的。因此,我尝试在伞头文件MyModule.h中导入MyModule-Swift.h。但是,如果这样做,我的Objective-C应用程序将无法编译。不确定是否因为MyModule-Swift.h是由Xcode在构建过程中动态生成的原因。

编辑2: 在此添加了一个样本项目以重现此问题: https://github.com/priteshshah1983/MyObjectiveCApp

相关代码位于ViewController.m中。使用master分支将构建失败。要使其工作,请检出working分支。

2个回答

3
使用@import MyModule;运行的原因是,“模块是框架可执行文件及其头文件的打包”(来自此SO帖子)。
换句话说,当您使用@import MyModule;时,Objective-C会自动导入所有与该模块相关的Swift和Objective-C头文件,而您无法从伞头文件中包含Swift头文件。建议您查看链接的SO答案中@import#import之间的区别。

-2
原来使用 @import MyModule; 而不是 #import <MyModule/Module.h> 允许从 Objective-C 应用程序中按预期使用 walkswiftWalk 方法。
我并不真正理解细节,但我希望这能帮助其他人。请随意解释!

请随意解释。 我的动机是什么?你已经将正确答案授予了自己,所以赏金无法获得。你也白白浪费了50个点数…而且这个问题还很烂。"但是,这不起作用"甚至是什么意思? - matt
好的,我撤回了我的答案作为正确答案。抱歉,我认为我无法比这更好地解释它了。我注意到你已经因此对我投了反对票! - pshah
你为什么不能展示所有实际需要的代码,让别人理解并复现问题呢? - matt
在此添加了一个示例项目以重现此问题:https://github.com/priteshshah1983/MyObjectiveCApp - pshah
你应该将 @vigneshv 标记为正确的。 - marchinram

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