在 Swift 中包含 C++ 头文件

2024-01-14

我有一个 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.h 中的向量

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

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


不幸的是,不可能直接在 Swift 中使用 C++ 类,请参阅https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216-CH2-ID0 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 */

这是 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

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

let x = someClass_oc()

x.someFunc(123.456)

因此,您可以在 Swift 中创建一个对象,该对象由 C++ 类的实例支持。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift 中包含 C++ 头文件 的相关文章

随机推荐

  • Node js 单元测试:模拟需要依赖

    我在为以下设置编写单元测试作为 jira js 文件 在 node js 模块中 时遇到问题 var rest require restler https www npmjs com package restler module expor
  • 将 pyno 与我现有的 python 安装一起使用

    我正在尝试使用 PyUNO 作为从 Django 服务器内将不同文档格式 doc wordperfect html 等 转换为 PDF 的方法 我很难受import uno上班 做的时候好像失败了import pyuno 带有一条消息Imp
  • 从 Drupal 站点内重定向到新页面

    我正在使用 Drupal 站点 我们想要设置一个重定向到外部站点的特殊 URL 换句话说 如果http www mysite com http www mysite com是我们的 Drupal 网站 我们想要http www mysite
  • 美元符号和/或破折号破坏 Razor 的解析器

    我试图呈现的最终结果
  • clojurescript:触摸事件和 Domina

    我无法从 Domina 的 touchstart 事件中获取 touch 或 changedTouches 列表 这是我的 require 东西 ns myproj require macros hiccups core as h requ
  • 如何显示小时范围

    我有一个数据库表 以 TIME 格式存储餐厅的营业时间作为时间范围 例如 如果餐厅的营业时间是 上午 9 点至下午 5 点 则会有 2 列 hours open 和 hours close 我将 9 00 存储在 hours open 中
  • 如何查看文本通道的权限值? [不和谐.py]

    我想检查文本通道是否已将权限设置为特定值 特别是发送信息允许 基本上我想要这样的东西 bot command async def perm ctx channel discord TextChannel None if send messa
  • 如何获取视图中的列级依赖关系

    我已经对这个问题进行了一些研究 但还没有解决方案 我想要得到的是视图中的列级依赖关系 所以 假设我们有一张这样的表 create table TEST first name varchar 10 last name varchar 10 s
  • 滚动时图像变化

    继另一个那么问题 https stackoverflow com questions 15861645 change image on scroll 该脚本更改页面滚动上的图像 然而 如果该脚本用于包含 200 多个图像的视频帧 则该脚本将
  • 配置 redis 以一致地首先逐出旧数据

    我在 redis 中存储了一堆实时数据 我将所有按键的 TTL 设置为 14400 秒 4 小时 我已将 maxmemory 设置为 10G 目前内存中的空间不足以容纳 4 小时的数据 而且我没有使用虚拟内存 因此 Redis 会在数据过期
  • 如何计算每个id的总和

    使用水晶报表7 我想查看表1和表2的总和 table1 id name 001 raja 002 vijay 003 suresh table2 id value 001 100 001 200 001 150 002 200 003 15
  • 使用画布(三.js)覆盖画布(WebGL)

    我有两块画布 第一个应该是背景 其内容通过原始 WebGL 3D 渲染 第二个画布应该覆盖第一个画布 并且主要是透明的 它的内容通过 Three js 3D 内容 呈现 不幸的是 第二个画布不是绘制在第一个画布的上面 而是绘制在它的旁边 如
  • 如何使用 swiftUI 创建平滑的颜色变化动画? (有问题的例子)

    I have a play pause button that changes when pressed At the moment it just fades in and out but I would like it to perfo
  • C# 将 Lambda 表达式函数转换为描述性字符串

    我有一个完全不必要的困境 我正在懒洋洋地寻找一个将 lamda 表达式转换为字符串的函数 让我烦恼的是 我每次都输入这个缓存键 但我真的不想花时间创建它 我想将它用于我创建的缓存函数 如果我想获取一个人的名字而不是每次都调用该函数 那么在哪
  • 直观地看 For 循环中 fork() 会发生什么

    我一直在试图理解fork http en wikipedia org wiki Fork system call 行为 这次在一个for loop 观察以下代码 include
  • 对于 Swing 应用程序,通过 JNA 调用 GetOpenFileName 失败

    我正在尝试使用 Java 中的本机 Windows 文件对话框 使用 JNA 调用 comdlg32 函数GetOpenFileName 我做了一个静态方法 OpenFileDialog display看起来像这样 public stati
  • Prolog 中的简单图搜索

    我正在尝试在 SWI Prolog 中编写一个简单的图形搜索代码 我想出了以下程序 adjacent 1 4 adjacent 4 2 adjacent 3 6 adjacent 6 4 adjacent 7 10 adjacent 4 9
  • 如何正确地与反应形式进行双向绑定?

    到目前为止 我一直认为你不应该混合使用 ngModel 与反应形式 而不是简单地使用formControlName 然而 对我来说 这似乎不起作用 我有一个表单并向其中添加控件 this exportForm addControl surc
  • 如果字段为空,则通过 jQuery 禁用发送按钮

    如果有一个或多个输入字段为空 如何禁用发送按钮 我在伪代码中的尝试 if input empty input disabled else enable the ask question button 我一直在阅读这些文章但没有找到正确的解决
  • 在 Swift 中包含 C++ 头文件

    我有一个 C 头文件 名为header h 我想将其包含到我的 Swift 项目中 由于我想要包含的 C 框架尚未完成 所以我现在只有头文件 我的 C 头文件header h看起来有点像这样 include