这是编译器预期的行为,有很好的理由。
I think the majority of people running into this issues is caused after they switch from Application Target to Framework Target and start adding C and Objective C headers into framework's umbrella header expecting it to have a same behaviour as application's Bridging Header, which behaves differently. The umbrella header is actually designated for mixed swift, obj-c framework and its purpose is exposing the APIs to the outer world that your framework has in objective-c or c. That means the headers we put there should be in the public scope.
它不应该被用作将不属于框架的Objective-C/C头文件暴露给框架swift代码的地方。因为在这种情况下,这些头文件也将作为框架模块的一部分对外公开,这通常不是我们想要做的,因为它破坏了模块化。(这就是为什么允许非模块化包含在框架模块默认为NO)
为了将Objective-C/C库公开给你的框架swift代码,我们应该为这个库定义一个单独的swift模块。然后可以使用标准的快速导入YourLegacyLibrary。
让我在一些典型场景中演示这一点:将libxml2嵌入到我们的框架中。
1. 首先需要创建一个模块。Modulemap文件,如下所示:
对于OSX框架:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
对于iOS框架:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
它所做的只是将头文件和它在swift模块中引用的其他头文件打包起来,这样swift就能够为这些C接口生成swift绑定。
2. 然后在你的xcode项目目录中创建一个文件夹SwiftLibXML2,并把这个模块。modulemap那里
3.在构建设置中,将$(SDKROOT)/usr/include/libxml2添加到头搜索路径中
4. 在Build Settings中,将$(SRCROOT)/SwiftLibXML2添加到Import Paths中
5. 在Project的General选项卡下,添加libxml2。tbd到链接的框架和库。
现在你可以在需要的地方导入这个模块:
import SwiftLibXML2
(如果你想看一个更完整的模块。地图的例子,我建议参考达尔文的模块。模块映射在/usr/include/module。modulemap,你需要安装Xcode命令行工具才能到达那里,参考OS X El Capitan中缺少/usr/include)