混合编写Objective-C和Swift框架制作

10

因此,我开始为现有的Objective-C框架添加Swift。

坏消息是这个过程相当简单,并且看起来像是有效的。也就是说,我让Swift代码看到了obj-c类,并且甚至相当容易地构建了起来。我设置了一个桥接标头,加入了所需内容,更改了模块名称等等,基本上一切都工作得很好。

后来我意识到了一些问题。

首先,在框架中不应该有桥接标头。实际上,我尝试了一个测试项目,但它不让我这么做。但在我的实际项目中,它却可以。

这绝对会导致问题。我认为这是因为它似乎将桥接标头包含在Swift生成的标头中,或者可能是由于它如何导入总头文件的原因之一。我理解让Swift自动使用Umbrella header以及仅此而已的简便性,但出于几个原因,我需要另一个标头文件。

  1. 从内部框架中导入私有标头而不想公开框架标头。
  2. 导入我们链接到的其他框架,并需要访问其公共标头。我不想在此框架的总头文件中导入这些其他框架。

在这种情况下,我面临着几个问题。

外部目标无法使用 @import 加载此框架。我也不能直接导入框架的桥接标头。这意味着我无法从另一个目标访问Swift代码。我编写了一个访问器类,这种情况下不是大问题。直到我意识到其中包含一个测试用例目标,所以我不能有效地测试这段代码,除非有某种实现测试的方式,它将位于框架目标中。甚至我的测试目标中都没有办法访问Swift。

那么有没有办法做到这一点?简而言之,“我可以拥有一个混合Swift / Obj-c框架,使其Swift + Obj-c可从外部访问并保留一些私有的Obj-c吗?”


我非常确定你可以做到,我的朋友,请看这里:https://dev59.com/S14b5IYBdhLWcg3wrzbY - Larry Pickles
看起来是一个有趣的情况。请随时告诉我们进展如何或者是否遇到其他问题。之前评论中提到的另一个问题涉及在Swift中使用Obj-C框架,但根据提到的苹果文档,可以使用Obj-C和Swift混合编写框架。 - Anatoli P
我认为这个问题目前还没有解决方案。似乎只能通过公共的objc头文件或公共的swift类型来实现互操作性。对于我来说,这使得混合框架和缓慢而稳定地将框架迁移到Swift变得毫无用处,因为框架的关键功能是仅公开特定的API并保持大部分内容私有。如果有专家能够阐明为什么会出现这种情况,我会很感激,并把它作为答案接受。 - Felix Lieb
@napierzaza:看一下这个链接:https://dev59.com/f2Ag5IYBdhLWcg3wE3nQ#24005242 他说:“在某些情况下,特别是在使用ObjC框架时,您不会明确添加Objective-C类,并且Xcode无法找到链接器。 在这种情况下,请按上述方式创建您的.h文件,然后确保在您的目标项目设置中链接其路径。” 我的框架与桥接头文件一起工作!事实上,否则它无法编译,但是,我卡在将此框架(项目)导入其他应用程序目标上。我的报错为“无法导入桥接头文件***”。 - Sunil Chauhan
1个回答

0

我解决了。

我在类和协议中添加了public,这样我就可以在Objective-C中访问Swift代码了。


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