基于iOS Swift的dynamic框架中的Objective C类

情况:

我有一个用Swift编写的iOS dyanmic框架。 我还得到了一堆用Objective C编写的类,我将在Swift类中使用这些类(有些是公共的,有些是私有的)。 不过 ,我希望Objective C类不要暴露在使用框架的项目中


我曾经尝试过:

伞头

据我所知,我应该在我的伞头文件(通常是FrameworkName.h使用#import header.h导入,然后确保我希望包含在Swift类中的所有Objective C头文件都标记为“公共”,在“构build阶段” – >“标题”下。

但是,这样做会自动将项目使用框架公开给框架使用的所有私有Objective C类。

模块映射(使用单独的模块)

正因为如此,我研究了使用模块映射,这是logging在这里 。 我已经看过其他用户的post,比如这个和这个 ,以及这个Github的回购 。

我成功地得到了以下工作:

 //SharedClasses/module.modulemap module SharedClasses { } //SharedClasses/module.private.modulemap module SharedClasses.Private { header "header.h" export * } 

问题是,在我的项目(有这个框架导入),这个:

 import Framework import Framework.SharedClasses 

被允许,随后“隐藏的”Objective C类被暴露。 也许这只是模块如何工作? 有没有办法让他们真正的私人?

模块映射(使用框架私有模块)

另外,我已经尝试在我的框架的根目录下创build一个module.private.modulemap文件,内容如下:

 explicit module Framework.Private { header "header.h" export * } 

然后在MODULEMAP_PRIVATE_FILE下链接我的目标的构build设置。 但是,当我在框架的Swift类中import Framework.Private ,会引发编译器错误:

“没有这样的模块”Framework.Private“

我不明白为什么会出现这个错误。

模块映射(使用私有头文件)

我注意到在Clang文档中提到了一个private说明符:

具有私有说明符的头文件可能不包含在模块外部。

我的理解是,因为我框架中的所有Swift类已经是模块Framework一部分,所以如果我用下面的方法创build一个module.modulemap文件:

 framework module Framework { umbrella header "Framework.h" private header "header.h" export * module * { export * } } 

那么一切都应该工作! Objective C头文件只能在模块(即框架的Swift类)中访问,并且不会暴露给任何使用该框架的项目。 很酷,但它不工作…编译器只是无法识别Objective C类。 没有其他的错误被抛出,但是你不能使用头文件,所以就像你没有在头文件中包含头文件一样。 为什么? 那么什么是私人说明符?


所以,重申我原来的问题:

有什么办法可以在iOSdynamic框架中导入用于Swift类的Objective C头文件,同时保持它们是私有的,并且不能从使用所述框架的任何项目访问?

感谢您的阅读,并对长期发帖感到抱歉。 这是漫长的一天(和晚上)…

你可以从这个链接find一些方法。

只需使用module.modulemap创buildFolder(egPrivateA),其中包括您需要在Swift类中使用的所有对象头。 例如

 module $(ModuleName)Private { header "header.h" export * } 

在Swift中,你可以使用: import $(ModuleName)Private

所以,当使用import $(ModuleName)时候,默认模块排除这些头文件。

在我的实验中,testing项目也可以import $(ModuleName)Private ,但是没有find有用的代码。

无论如何试试这个方法。