Swift 5.9 Cpp-Swift互操作:添加NSObject一致性后调用失败
Swift 5.9 C互操作:添加NSObject一致性后类无法被C识别的解决办法
问题原因
当Swift类继承NSObject或遵循NSObjectProtocol时,编译器会将其标记为Objective-C兼容类型,而Swift 5.9的C互操作机制默认只暴露纯Swift类型(非Objective-C兼容的类型)到生成的CoreModule-Swift.h头文件中,因此C代码无法找到对应的类。
解决方案
方案1:拆分纯Swift类与NSObject兼容类
保留一个纯Swift类供C++调用,单独创建NSObject子类用于Objective-C场景:
import Foundation // 纯Swift类,专门供C++调用 public class MySwiftClass { public static func testInterop() { NSLog("----------- hey --------") } } // 继承NSObject的类,用于Objective-C相关场景 @objc public class MySwiftNSObjectWrapper: NSObject { @objc public static func testInterop() { MySwiftClass.testInterop() } }
C++端的调用代码无需修改,依然可以正常使用CoreModule::MySwiftClass::testInterop()。
方案2:强制暴露Objective-C兼容类到C++
使用Swift 5.9的@_expose(Cxx)属性,强制将NSObject子类暴露给C++。修改Swift代码如下:
import Foundation @_expose(Cxx) public class MySwiftClass: NSObject { public static func testInterop() { NSLog("----------- hey --------") } }
注意:
@_expose(Cxx)是未公开的私有属性(以下划线开头),未来Swift版本可能调整,但当前5.9/6.0版本可稳定使用。
方案3:检查项目配置
如果以上方法无效,确认以下项目设置:
- 打开Swift目标的Build Settings,确保
C++ Interoperability选项设置为Generated Header或On - 确保类和方法的访问级别都是
public,且方法参数/返回值没有Swift特有类型(如部分Swift专属类型会导致无法暴露)
内容的提问来源于stack exchange,提问作者Vipul Gupta
相关产品推荐
相关产品推荐

