Swift扩展方法无法通过C++互操作调用的问题求助
Swift扩展静态方法无法通过C++互调用访问
我在使用新互操作机制的项目中,已成功从C++调用Swift类的静态方法,但调用Swift扩展中的静态方法时出现错误:'InteropExtension::SwiftCode'中没有名为'GetExtData'的成员。
C++代码
#include "CppSource.hpp" #include "InteropExtension-Swift.h" void CppSource::CppToSwiftCall() { // 调用成功 InteropExtension::SwiftCode::GetClassData(); // 下方调用引发错误,为何Swift扩展方法无法调用? InteropExtension::SwiftCode::GetExtData(); }
Swift代码
import Foundation public class SwiftCode { public static func GetClassData () -> String { return "classMethod" } } extension SwiftCode { public static func GetExtData () -> String { return "ExtMethod" } }
原因分析
Swift/C互操作工具链在生成-Swift.h头文件时,默认只会解析并暴露类本身定义的成员,不会自动包含扩展中的方法——哪怕扩展方法是public修饰的。这是因为扩展在Swift中的语义是对类的补充,但当前互操作机制尚未默认将扩展成员纳入C可见范围。
解决方案
方案一:用@_expose(Cxx)显式暴露扩展方法
修改Swift扩展中的方法,添加@_expose(Cxx)属性,强制将该方法暴露给C++:
extension SwiftCode { @_expose(Cxx) public static func GetExtData () -> String { return "ExtMethod" } }
修改后重新生成头文件,C++中即可直接调用InteropExtension::SwiftCode::GetExtData()。
注意:
@_expose(Cxx)是Swift的未公开属性,当前版本可用,但未来Swift迭代可能会调整该机制。
方案二:在原类中添加转发方法
如果不想依赖未公开属性,可以在SwiftCode类内部添加一个静态转发方法,间接调用扩展中的方法:
public class SwiftCode { public static func GetClassData () -> String { return "classMethod" } // 转发扩展方法 public static func GetExtData() -> String { return Self.GetExtData() } } extension SwiftCode { public static func GetExtData () -> String { return "ExtMethod" } }
此时C++中的调用代码无需修改,即可正常调用InteropExtension::SwiftCode::GetExtData()。
内容的提问来源于stack exchange,提问作者Vipul Gupta
相关产品推荐
相关产品推荐

