我有一个混合的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
分支。
答案 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应用程序所期望的walk
和swiftWalk
方法。
老实说,我不了解细节,但我希望这有助于其他人。请随便解释一下!