【发布时间】:2016-05-15 17:24:28
【问题描述】:
我有一个用 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++ 类?我似乎找不到任何关于此的内容。
【问题讨论】:
-
我个人求助于编写简单的 Objective-C++ 包装文件,这些文件公开了一个 Objective-C 类,该类重现所有相关的 C++ 调用,并将它们简单地转发到 C++ 类的持有实例。在我的例子中,C++ 类和调用的数量很少,所以不是特别耗费人力。但我会暂缓将其作为答案,希望有人能提出更好的建议。
-
嗯,这有点……让我们拭目以待(并希望)。
-
我收到了一个通过 IRC 编写的 Swift 包装类的建议,该类维护一个指向实际 C++ 对象的 void 指针并公开所需的方法,这些方法实际上只是通过 C 桥和指向对象的指针。
-
作为对此的更新,Swift 3.0 现已发布,尽管之前做出了承诺,但 C++ 互操作性现在被标记为“超出范围”。