如何在框架目标中调用Objective-C中的Swift代码?
将Swift文件添加到Objective-C项目时,Xcode将生成Swift到ObjC头,如下所述: 如果没有这个头,就不可能从Objc-C调用Swift代码。但是Xcode不能为我的框架目标自动生成这个头 如果我创建一个Objective-C应用程序并将一个Swift文件放入其中,那么它会自动生成一个,所以我怀疑这是因为我在构建一个框架,而不是一个应用程序。如果没有,则无法使用Obj-C代码中的Swift代码 我尝试使用为应用程序生成的文件(在重命名它并将其放入相应的DerivedData文件夹后),但Xcode没有更新它,实际上它最终将删除它,因此手动创建或尝试维护此文件是不可行的 如何让Xcode为框架目标生成此头文件,以便从Obj-C代码调用Swift代码如何在框架目标中调用Objective-C中的Swift代码?,objective-c,xcode,swift,Objective C,Xcode,Swift,将Swift文件添加到Objective-C项目时,Xcode将生成Swift到ObjC头,如下所述: 如果没有这个头,就不可能从Objc-C调用Swift代码。但是Xcode不能为我的框架目标自动生成这个头 如果我创建一个Objective-C应用程序并将一个Swift文件放入其中,那么它会自动生成一个,所以我怀疑这是因为我在构建一个框架,而不是一个应用程序。如果没有,则无法使用Obj-C代码中的Swift代码 我尝试使用为应用程序生成的文件(在重命名它并将其放入相应的DerivedData文
大家记住:问题是从Obj-C调用Swift,而不是从Swift调用Obj-C。我创建了一个新的框架项目,添加了Obj-C和Swift文件,并且能够做到这一点:
// MyObjCClass.m
#import "MyObjCClass.h"
#import <MyFramework/MyFramework-Swift.h>
@implementation MyObjCClass
- (void)test {
[[MySwiftClass alloc] init];
}
@end
更多信息可在“将Swift导入Objective-C”下找到。您需要什么?桥接头或生成的Obj-C接口?我需要能够将Swift源文件添加到Obj-C框架,并能够从Obj-C代码调用Swift类。您有什么问题?没有生成Swift桥接头。如果没有Swift桥接头,就不可能在同一代码库中从Obj-C代码调用Swift代码。有趣的是,我刚刚建立了一个测试项目,似乎有一个第22条军规。Xcode不会生成“FrameworkName Swift.h”文件,除非我在Swift编译器构建设置中指定了桥接头,但如果我这样做,我会得到一个错误,即“不支持将桥接头与框架目标一起使用”。似乎
public
修饰符是关键。请注意,在我链接的文档中,它说:如果您的应用程序目标具有Objective-C桥接标头,则[此标头]还包含标记有内部
修饰符的标头。”是的,我尝试了internal
,但没有效果,因为在发布问题之前,框架上不能有Objective-C桥接头。我还创建了一个新框架,发现我不能像你那样使用MyFramework Swift.h,我的类是公共的。但区别是我在类前面加了@objc和intere吝啬的是你没有。我会在没有它的情况下做更多的实验,看看会发生什么。在我的示例项目中,@objc
的存在不会影响它。据我所知,导入标题时必须使用它。
public class MySwiftClass: NSObject {
// ...
}