在同一个框架

时间:2018-03-01 22:56:19

标签: objective-c swift xcode llvm

我们目前有一个遗留的Objective-C框架,我们想将一些Swift组件引入其中。但是,我无法弄清楚如何从我们的Swift文件中访问私有和项目范围的Objective-C文件。

我们已经使用了一个伞形头和一个模块图文件来声明应该包含在库模块中的公共头文件,我们希望将它们保留为唯一公开的文件。但是,我们的新Swift文件(在同一框架内)还需要访问我们不想公开的私有标头。

我已经尝试定义一个私有模块映射文件,列出我想要使用的私有标头,然后使用MODULEMAP_PRIVATE_FILE构建设置指定它,但我不认为这样做我们想要的。它似乎引入了一个新的MyLibrary.Private模块,该模块对于外部目标(例如单元测试目标)是公开可见的,但仍然不能用于框架内的Swift文件。

任何关于如何实现这一目标的建议,或者在其他项目中做到这一点的经验都会有很大的意义。

谢谢!

1 个答案:

答案 0 :(得分:0)

最近我遇到了完全相同的问题。情况是,您可以采用另一种方法来实现它,只需在内部将Swift暴露给Objective-C。通过一些手动工作,它将允许您在Swift内部(内部和在同一框架目标内)使用Objective-C类,而无需真正将ObjC暴露给Swift。

这种情况太复杂了,无法在此处粘贴所有内容。我正在向有关该主题的文章添加链接。这是一般的想法:

  1. 使用Swift协议模仿您的ObjectiveC类
  2. 在您的快速代码中使用此协议
  3. 在内部将这些Swift协议暴露给Objective-C(需要手工操作)
  4. 通过ObjC类采用这些协议
  5. 在Swift中创建并在ObjC中公开一个工厂,该工厂将创建这些协议的实例
  6. 在工厂方法中创建,这将允许您注册具体类型,并将其公开给ObjC
  7. 在Swift工厂中的Objective-C代码中注册ObjC类型
  8. 使用工厂实例化ObjC类,而无需实际将ObjC暴露给Swift(hurray;))

Creating Swift framework with private Objective-C members. The Good, the Bad, and the Ugly

Github example project