You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免Internal修饰的声明出现在project-swift.h头文件中

问题原因

  1. Swift默认的访问控制级别为internal,你示例中的AddOnsViewController没有显式声明public/open修饰符,实际属于internal访问级别。
  2. 苹果官方文档描述的「仅public/open声明出现在生成头中」是Release发布构建的默认行为,Debug调试构建下,Swift编译器默认会将所有继承自Objective-C类、或标记了@objc的internal级别的声明也写入生成的Swift-ObjC兼容头中,方便调试阶段的运行时访问。
  3. 该行为和是否配置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修饰,示例代码修改如下:
    @nonobjc class AddOnsViewController: UIViewController {
        // 类内部实现保持不变
    }
    
    添加后整个类不会出现在生成的兼容头文件中,也不会被sharpie扫描到。
  • 方案4:调用sharpie生成绑定时添加过滤规则,通过--exclude参数指定不需要生成绑定的类名,或者生成ApiDefinitions.cs后手动删除不需要的internal对应声明即可。

内容的提问来源于stack exchange,提问作者Daniel Burton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:06:11