【发布时间】:2018-01-09 02:44:55
【问题描述】:
我正在尝试从 Swift 访问用 C++ 标头编写的 enum 的值。具体来说,我在 OpenCV 的 hpp 头文件中有这个 enum,我想将它的值公开给 Swift。我试图在 Swift 和 Objective-C 之间设置一个桥接头,并在我想公开的 C++ 枚举值周围放置一个包装器,但编译器对此并不满意:
imgproc.hpp:C++ 头文件
enum ThresholdTypes {
THRESH_BINARY = 0,
THRESH_BINARY_INV = 1,
THRESH_TRUNC = 2,
...
};
桥接头:
#import "OpenCVWrapper.h"
OpenCVWrapper.h:我的 Objective-C Wrapper 类要暴露给 Swift
#ifdef __cplusplus
#import <opencv2/core.hpp>
#import <opencv2/imgproc.hpp>
#endif
#import <Foundation/Foundation.h>
@interface OpenCVWrapper : NSObject
typedef enum {
Binary = cv::THRESH_BINARY, // ERROR: use of undeclared identifier `cv`
BinaryInv = cv::THRESH_BINARY_INV // ERROR: use of undeclared identifier `cv`
} ThresholdingType;
...
@end
如果我将此枚举声明和 C++ 代码 (OpenCV) 导入到 OpenCVWrapper.mm 中,那么编译器就可以了,我也可以很好地使用它,但我想将此枚举公开给 Swift,所以它必须在头文件中。但是,当我直接在 Objective-C 标头中公开 C++ 枚举时,有些事情是不对的。
是否可以直接从 Objective-C 标头访问 C++ 常量/枚举,从而可以桥接到 Swift?
【问题讨论】:
-
正如stackoverflow.com/questions/35229149/… 中指出的,桥接头文件不能处理C++。无论您是直接包含 .hpp 文件还是通过另一个 .h 文件间接包含该文件。
-
从 C 过渡到 Swift 会更容易吗?在 OpenCV 2 中,有一个 C API for OpenCV。不幸的是,OpenCV 3 中似乎已经放弃了维护:openCV will drop C API support soon。这是 2013 年的问答。谷歌搜索“opencv c api”,我发现了一些 C API 文档。 OpenCV 3 各个类别的页面。
-
@Scheff,我想避免将来可能停止工作的解决方案,但感谢您的参考。
标签: c++ objective-c swift enums bridging-header