在 Swift 中包含 C++ header 文件

Include C++ header file in Swift

我有一个 C++ header 文件(名为 header.h),我想将其包含到我的 Swift 项目中。

由于我要包含的 C++ 框架尚未完成,我现在只有 header 文件。

我的 C++ header 文件 header.h 看起来有点像这样:

#include <vector>

struct someStruct{
    float someAttr;
}

class someClass{
    public:
        enum SomeEnum{
            Option1,
            Option2
        }

        void someFunc(const double value) {}
}

问题是,当我尝试将 header.h 文件包含在 project-Bridging-Header.h 中时,它永远找不到我包含在 header.h

中的向量

我尝试将 header.h 重命名为 header.hpp。 我尝试在右侧面板中将桥接 headers Type 设置为 C++ Header。 但是 none 帮助了他们。

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

不幸的是,无法在 Swift 中直接使用 C++ class,请参阅 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216-CH2-ID0

You cannot import C++ code directly into Swift. Instead, create an Objective-C or C wrapper for C++ code.

实际上,包装 C++ 以便在 Swift 中使用的一种便捷方法是 Objective-C++。 Objective-C++ 源文件可以混合包含 Objective-C 和 C++ 代码。这是一个基于您问题中的代码片段的快速部分示例。此处仅 someClass 被部分包裹。在生产代码中,您还需要考虑内存管理。

包装器的 header 文件,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 */

这里是 Objective-C++ 实现,mywrapper.mm。请注意 .mm 扩展名。您可以使用 .m 创建一个 Objective-C 文件,然后重命名它。

    #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

现在您可以在桥接 header 中导入 mywrapper.h,然后在 Swift 中执行类似的操作:

let x = someClass_oc()

x.someFunc(123.456)

因此您可以在 Swift 中创建一个 object,它由您的 C++ class 实例支持。

这只是一个简单的示例,可以让您了解一下。如果您 运行 遇到其他问题,他们可能应该单独提问。