我有一个用 C++ 编写的重要类库。我试图通过 Swift 中的某种类型的桥梁来使用它们,而不是将它们重写为 Swift 代码。主要动机是 C++ 代码代表了在多个平台上使用的核心库。实际上,我只是在创建一个基于 Swift 的 UI 以允许核心功能在 OS X 下工作。
还有其他问题在问,“我如何从 Swift 调用 C++ 函数。”这 不是 我的问题。要桥接到 C++ 函数,以下工作正常:
通过“C”定义一个桥接头
#ifndef ImageReader_hpp
#define ImageReader_hpp
#ifdef __cplusplus
extern "C" {
#endif
const char *hexdump(char *filename);
const char *imageType(char *filename);
#ifdef __cplusplus
}
#endif
#endif /* ImageReader_hpp */
Swift 代码现在可以直接调用函数
let type = String.fromCString(imageType(filename))
let dump = String.fromCString(hexdump(filename))
我的问题更具体。如何在 Swift 中实例化和操作 _C++ 类_?我似乎找不到任何关于此发表的内容。
原文由 David Hoelzer 发布,翻译遵循 CC BY-SA 4.0 许可协议
我已经制定了一个完全可以管理的答案。你希望它有多干净完全取决于你愿意做多少工作。
首先,获取您的 C++ 类并创建 C“包装器”函数来与其交互。例如,如果我们有这个 C++ 类:
然后我们实现这些 C++ 函数:
然后桥头包含:
在 Swift 中,我们现在可以实例化对象并与它进行交互,如下所示:
因此,如您所见,解决方案(实际上相当简单)是创建将实例化对象并返回指向该对象的指针的包装器。然后可以将其传递回包装函数,包装函数可以轻松地将其视为符合该类的对象并调用成员函数。
让它更清洁
虽然这是一个美妙的开始,并证明使用现有的 C++ 类和一个简单的桥是完全可行的,但它可以更加简洁。
清理这个只是意味着我们从我们的 Swift 代码中间删除
UnsafeMutablePointer<Void>
并将其封装到一个 Swift 类中。本质上,我们使用相同的 C/C++ 包装函数,但将它们与 Swift 类接口。 Swift 类维护对象引用,本质上只是将所有方法和属性引用调用通过桥传递给 C++ 对象!完成此操作后,所有的桥接代码都完全封装在 Swift 类中。尽管我们仍在使用 C 桥接器,但我们有效地透明地使用了 C++ 对象,而无需求助于在 Objective-C 或 Objective-C++ 中重新编码它们。