如何避免Internal修饰的声明出现在project-swift.h头文件中
问题原因
- Swift默认的访问控制级别为
internal,你示例中的AddOnsViewController没有显式声明public/open修饰符,实际属于internal访问级别。 - 苹果官方文档描述的「仅public/open声明出现在生成头中」是Release发布构建的默认行为,Debug调试构建下,Swift编译器默认会将所有继承自Objective-C类、或标记了
@objc的internal级别的声明也写入生成的Swift-ObjC兼容头中,方便调试阶段的运行时访问。 - 该行为和是否配置Objective-C Bridging Header无关,只要你的框架开启了Objective-C兼容头生成,Debug模式下就会出现这类internal声明。
解决方法
- 方案1:切换到Release配置构建框架后再用sharpie生成绑定。Release模式下编译器会自动过滤所有internal级别的声明,仅保留public/open修饰的公开接口到生成头文件中。
- 方案2:如果需要在Debug模式下也生成仅包含公开接口的头文件,修改框架的Build Settings配置:
找到Swift Compiler - Code Generation分组,添加Other Swift Flags为-Xfrontend -force-public-abi,或者直接将配置项Swift Objc Header Public Only(对应编译参数SWIFT_OBJC_HEADER_PUBLIC_ONLY)设置为YES,开启后所有构建模式下都会过滤internal声明。 - 方案3:对不需要暴露给Objective-C的internal类/方法主动添加
@nonobjc修饰,示例代码修改如下:
添加后整个类不会出现在生成的兼容头文件中,也不会被sharpie扫描到。@nonobjc class AddOnsViewController: UIViewController { // 类内部实现保持不变 } - 方案4:调用sharpie生成绑定时添加过滤规则,通过
--exclude参数指定不需要生成绑定的类名,或者生成ApiDefinitions.cs后手动删除不需要的internal对应声明即可。
内容的提问来源于stack exchange,提问作者Daniel Burton
相关产品推荐
相关产品推荐

