在 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 实例支持。
这只是一个简单的示例,可以让您了解一下。如果您 运行 遇到其他问题,他们可能应该单独提问。
我有一个 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 实例支持。
这只是一个简单的示例,可以让您了解一下。如果您 运行 遇到其他问题,他们可能应该单独提问。