我有一个Objective-C框架(框架A),其中包含一些公共头文件和私有头文件。这些公共头文件也被声明在框架的Umbrella头文件中。我有一个第二个Swift框架(框架B),它链接到Objective-C框架。
现在,如果我想在B中导入A的公共头文件,我只需要执行import A
。
但是我该如何导入私有头文件呢?
我知道桥接头文件不是选项,因为它不支持框架。我需要为私有头文件创建一个单独的Umbrella头文件吗?
我有一个Objective-C框架(框架A),其中包含一些公共头文件和私有头文件。这些公共头文件也被声明在框架的Umbrella头文件中。我有一个第二个Swift框架(框架B),它链接到Objective-C框架。
现在,如果我想在B中导入A的公共头文件,我只需要执行import A
。
但是我该如何导入私有头文件呢?
我知道桥接头文件不是选项,因为它不支持框架。我需要为私有头文件创建一个单独的Umbrella头文件吗?
你需要修改框架A
,使其导出一个私有模块。
在A
项目中创建一个私有模块映射文件。文件内容应该类似于:
A/private.modulemap:
explicit module A.Private {
// Here is the list of your private headers.
header "Private1.h"
header "Private2.h"
export *
}
在A
框架目标的“构建设置”中,搜索“私有模块映射文件”行,并将其设置为: $(SRCROOT)/A/private.modulemap
不要将private.modulemap
文件包含在“编译源”中。这会导致不必要的警告。
清理并构建框架A
目标。
在框架B的Swift文件中,你可以像这样导入私有模块:
import A
import A.Private
这个问题发布已经有一段时间了。被接受的回答非常好,就我而言,这是一种常见的方法。
问题在于,它并不真正是“私有的”。你可以在框架内部执行此操作以访问“私有”部分:
// Framework A Swift file
import A.Private
但是,如果你在应用程序中使用框架A(或者将其交付给客户),他仍然可以做到:
// Client App Swift file
import A
import A.Private
// access "private" framework methods and classes
我的情况可能是特定于我的设置,但我将在这里提供它,以防它能帮助其他人。我还有一个Objective-C框架(框架A),其中包含私有标头,我需要在链接它的Swift框架(框架B)中使用它。一些额外的细节:
Each framework is in a separate project in the workspace
The project uses CocoaPods
The podspec defines the following dependence relationship between the two frameworks:
s.subspec 'FrameworkA' do |cs|
cs.vendored_frameworks = "lib/FrameworkA.framework"
end
s.subspec 'FrameworkB' do |ts|
ts.dependency 'FrameworkA'
ts.vendored_frameworks = "lib/FrameworkB.framework"
end
FrameworkB
无法使用位于FrameworkA
中的私有模块映射路径找到私有头文件。对我有效的方法是在私有模块映射中使用相对路径到PrivateHeaders
目录。module FrameworkA_Private {
header "../FrameworkA.framework/PrivateHeaders/Private.h"
export *
}
A
中,你仍然可以执行import A.Private
。 - Andrzej Michnia