在 Swift 中包含 C++ 头文件

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.hheader.hpp. 我尝试在右侧面板中将桥接标头类型设置为 C++ 标头。但他们都没有帮助。

我希望你们中的一些人可以帮助我找出我做错了什么。

Ana*_*i P 5

不幸的是,无法直接在 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++ 类的实例支持。

这只是一个简单的例子,旨在为您提供一个想法。如果您遇到其他问题,他们可能需要单独提问。