gpt4 book ai didi

c++ - 在 Swift 中包含 C++ 头文件

转载 作者:搜寻专家 更新时间:2023-11-01 06:39:08 25 4
gpt4 key购买 nike

我有一个 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) {}
}

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

'vector' file not found

我尝试将 header.h 重命名为 header.hpp。我尝试在右侧面板中将桥接 header 类型设置为 C++ header 。但他们都没有帮助。

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

最佳答案

不幸的是,无法在 Swift 中直接使用 C++ 类,请参阅 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 被部分包裹在这里。在生产代码中,您还需要考虑内存管理。

包装器的头文件 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 中创建一个对象,该对象由您的 C++ 类的实例支持。

这只是一个简单的例子,可以给你一个想法。如果您遇到其他问题,他们可能应该单独提问。

关于c++ - 在 Swift 中包含 C++ 头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37804467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com