目前不支持这个功能。从Swift代码中与C++代码通讯的方法只有两种:
使用Objective-C++将你的C++代码封装在ObjC中,就像你已经找到的那样。
利用C++大部分兼容C的事实,Swift可以调用C,为你的C++类编写一个C包装器,并从Swift中使用它。一种常见方法是:
cppwrapper.h
struct MyCppClass; // In C++ class and struct are the same, so this looks like a C struct to C, and as long as you don't look inside it, you can use pointers to it in C code.
extern "C" { // Tell C++ to turn off overloading based on type so it's C-compatible.
struct MyCppClass* MyCppClass_new( int firstParam );
void MyCppClass_delete( struct MyCppClass* inThis );
void MyCppClass_setFirstParam( struct MyCppClass* inThis, int firstParam );
} // extern "C"
cppwrapper.cpp
#include "cppwrapper.h"
#include "MyCppClass.hpp"
extern "C" MyCppClass* MyCppClass_new( int firstParam )
{
return new MyCppClass( firstParam );
}
extern "C" void MyCppClass_delete( MyCppClass* inThis )
{
delete inThis;
}
extern "C" void MyCppClass_setFirstParam( struct MyCppClass* inThis, int firstParam )
{
inThis->SetFirstParam( firstParam );
}
您甚至可以定义一个
MyCppClassSwiftWrapper
,其中包含一个类型为COpaquePointer的实例变量,用于存储C++对象。该类将在其构造函数中调用
MyCppClass_new
,在其析构函数中调用
MyCppClass_delete
,并且将包含一个围绕
MyCppClass_setFirstParam
的包装器,该包装器使用COpaquePointer作为其
inThis
参数。
我曾经写过一个(非常原始的)实用程序,可以让您标记C++头文件,并自动生成简单的C和Swift包装器(
https://github.com/uliwitness/cpptoswift/),但它无法处理模板,您可能还需要添加更多的类型映射。它还不能正确地处理传递/返回C++对象。
还有
https://github.com/sandym/swiftpp/,它做得更好,但我认为它仍然在其包装器下使用Objective-C,但至少您不必自己编写它。