基于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有用的代码。
无论如何试试这个方法。