在伞头

时间:2015-10-08 18:40:39

标签: ios objective-c swift

我有一个混合的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的框架。

我有一个名为ABUser的Objective-C类,

@interface ABUser: NSObject

- (void)walk;

@end

我想使用Swift为这个类添加新行为,所以我定义了一个扩展

extension ABUser {

func swiftWalk()

}

现在,我想要从Objective-C应用访问swiftWalk上定义的ABUser方法,我必须#import <MyModule/MyModule-Swift.h>。如果我想使用#import <MyModule/MyModule.h>方法,walk会有效。这假设伞头MyModule.h导入ABUser.h

我一直希望Objective-C应用程序#import <MyModule/MyModule.h>,并且永远不必担心API是在框架中用Objective-C还是Swift编写的。因此,我尝试在标题MyModule-Swift.h中导入MyModule.h。但是,如果这样做,我的Objective-C应用程序无法编译。不确定,如果这是因为在构建过程中Xcode会动态生成MyModule-Swift.h

编辑2 :添加了一个示例项目,可在此处重现此问题:https://github.com/priteshshah1983/MyObjectiveCApp

相关代码位于ViewController.m。构建将失败并显示master分支。要使其正常运行,请检查working分支。

2 个答案:

答案 0 :(得分:2)

使用@import MyModule;工作的原因是&#34;模块是框架可执行文件和它的标题包装在一起的&#34; (from this SO post)。

换句话说,当您@import MyModule;时,Objective-C会自动导入与模块相关的所有swift和Objective-C标头,而您不能在伞标题中包含swift标头。我建议您查看链接的SO答案中@import#import之间的差异。

答案 1 :(得分:-1)

事实证明,使用@import MyModule;代替#import <MyModule/Module.h>可以使用Objective-C应用程序所期望的walkswiftWalk方法。

老实说,我不了解细节,但我希望这有助于其他人。请随便解释一下!