如何在Swift与C++直接互操作中传递Swift对象至C++方法
Swift与C++框架内互操作问题解决方案
问题1:C++头文件找不到<Fibonacci/Fibonacci-Swift.h>
这个自动生成的头文件是Swift编译产物,按以下步骤排查修复:
- 确认框架Build Settings配置:
- 找到
Swift Compiler - General选项,将Install Objective-C Compatibility Header设为Yes。 - 确保
Objective-C Generated Interface Header Name的值为Fibonacci-Swift.h(默认就是框架名+后缀,无需修改,除非自定义过)。
- 找到
- 检查C目标的头文件搜索路径:
在C目标的Build Settings > Search Paths > Header Search Paths中添加$(BUILT_PRODUCTS_DIR)/Fibonacci.framework/Headers,并设置为non-recursive。 - 先编译Swift代码:这个头文件只有在Swift目标编译完成后才会生成,先Build Swift框架目标,再编译C++部分。
问题2:前置声明Swift类后RegisterCallback方法不被Swift识别
Swift 5.9+的直接互操作中,需要正确暴露Swift类并在C++中对应声明:
- 在Swift类上添加
@_expose(Cxx)属性,将其暴露给C++:
@_expose(Cxx) class SwiftSideInterfaceBridge { // 类实现代码 }
- 在C++头文件中,用Swift命名空间前置声明该类:
namespace Swift { class SwiftSideInterfaceBridge; } class CxxToSwiftInterfaceBridge { public: void RegisterCallback(Swift::SwiftSideInterfaceBridge* swiftObj); };
- 在C++实现文件(.cpp)中引入Swift生成的头文件:
#include <Fibonacci/Fibonacci-Swift.h> void CxxToSwiftInterfaceBridge::RegisterCallback(Swift::SwiftSideInterfaceBridge* swiftObj) { // 方法实现 }
这样Swift就能正确识别RegisterCallback方法的参数类型,因为C++中使用了Swift命名空间下的类声明,和Swift暴露的类完全对应。
内容的提问来源于stack exchange,提问作者Crazy Sage
相关产品推荐
相关产品推荐

