我有一个用Swift编写的iOS dyanmic框架.我还有一堆用Objective C编写的类,我将在我的Swift类中使用(一些是公共的,一些是私有的).但是,我希望Objective C类不会暴露给使用我的框架的项目.
伞头
根据我的理解,我应该#import header.h在我的伞头文件中导入,这通常是FrameworkName.h,然后确保我希望包含在我的Swift类中的所有Objective C头文件都标记为"Public",在Build Phases下 - >标题.
但是,这样做会自动使用我的框架将项目公开给框架使用的所有私有Objective C类.
模块映射(带独立模块)
正因为如此,我已经研究过使用模块映射,这是记录在这里.我看过其他用户的帖子,比如这个和这个,以及这个Github回购.
我成功完成了以下工作:
//SharedClasses/module.modulemap
module SharedClasses {
}
//SharedClasses/module.private.modulemap
module SharedClasses.Private {
header "header.h"
export *
}
Run Code Online (Sandbox Code Playgroud)
问题是在我的项目中(导入了这个框架),这个:
import Framework
import Framework.SharedClasses
Run Code Online (Sandbox Code Playgroud)
允许,然后暴露"隐藏的"Objective C类.也许这就是模块的工作原理?有没有办法让他们真正私密?
模块映射(带框架私有模块)
另外,我尝试module.private.modulemap在框架的根目录下创建一个文件,其中包含以下内容:
explicit module Framework.Private {
header "header.h"
export *
}
Run Code Online (Sandbox Code Playgroud)
然后在MODULEMAP_PRIVATE_FILE下链接我的目标的构建设置.但是,当我import Framework.Private在我的框架的Swift类中执行时,会抛出编译器错误:
"没有这样的模块'Framework.Private'
我不明白为什么会出现这种错误.
模块映射(带私有头)
我注意到在Clang文档中,private提到了一个说明符: …
我使用Xcode 7.2创建了一个新的基于Swift的项目。在ViewController.swift文件的viewDidLoad()方法中编写以下代码后:
if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad {
}
Run Code Online (Sandbox Code Playgroud)
我收到错误消息“使用未解决的标识符'UIUserInterfaceIdiomPad'”,并且编译器将无法继续。
我怀疑这与顶部的“导入UIKit”有关吗?由于某种原因,如果我删除该行并开始输入“ import UI”,则根本不提供自动完成选项。
我尝试过的事情:
问题:
谢谢!