fer*_*yyy 4 c++ vector include swift bridging-header
我有一个 C++ 头文件(名为header.h),我想将其包含到我的 Swift 项目中。
由于我想要包含的 C++ 框架尚未完成,所以我现在只有头文件。
我的 C++ 头文件header.h看起来有点像这样:
#include <vector>
struct someStruct{
float someAttr;
}
class someClass{
public:
enum SomeEnum{
Option1,
Option2
}
void someFunc(const double value) {}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试将header.h文件包含在 中时,project-Bridging-Header.h它永远找不到我包含在 header.h 中的向量
我尝试重命名header.h为header.hpp. 我尝试在右侧面板中将桥接标头类型设置为 C++ 标头。但他们都没有帮助。
我希望你们中的一些人可以帮助我找出我做错了什么。
不幸的是,无法直接在 Swift 中使用 C++ 类,请参阅https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/ TP40014216-CH2-ID0:
您无法将 C++ 代码直接导入到 Swift 中。相反,为 C++ 代码创建 Objective-C 或 C 包装器。
实际上,封装 C++ 以在 Swift 中使用的一种便捷方法是 Objective-C++。Objective-C++ 源文件可以混合包含 Objective-C 和 C++ 代码。这是基于您问题中的代码片段的快速部分示例。这里只是someClass部分包裹。在生产代码中,您还需要考虑内存管理。
包装器的头文件mywrapper.h没有 C++ 的痕迹:
#ifndef mywrapper_h
#define mywrapper_h
#import <Foundation/Foundation.h>
// This is a wrapper Objective-C++ class around the C++ class
@interface someClass_oc : NSObject
-(void)someFunc:(double)value;
@end
#endif /* mywrapper_h */
Run Code Online (Sandbox Code Playgroud)
这是 Objective-C++ 实现,mywrapper.mm. 请注意.mm扩展名。您可以使用 创建一个 Objective-C 文件.m,然后重命名它。
#import "mywrapper.h"
#import "header.h" // CAN import a C++ header here, in Objective-C++ code
// Use an extension on someClass_oc because we need to use someClass,
// but we couldn't do it in mywrapper.h,
// which is visible from Swift and thus can't contain C++ stuff.
@interface someClass_oc ()
{
someClass * ptrSomeClass;
}
@end
@implementation someClass_oc
-(id)init
{
// In this example ptrSomeClass is leaked...
ptrSomeClass = new someClass();
return self;
}
-(void)someFunc:(double)value
{
ptrSomeClass->someFunc(value);
}
@end
Run Code Online (Sandbox Code Playgroud)
现在您可以导入mywrapper.h桥接标头,然后在 Swift 中执行类似以下操作:
let x = someClass_oc()
x.someFunc(123.456)
Run Code Online (Sandbox Code Playgroud)
因此,您可以在 Swift 中创建一个对象,该对象由 C++ 类的实例支持。
这只是一个简单的例子,旨在为您提供一个想法。如果您遇到其他问题,他们可能需要单独提问。