swift - 快速访问C变量

标签 swift swift3 header interop bridge

我正在尝试访问 .h 文件中声明的状态变量,但编译器说该变量不存在。我是否需要在桥接头文件中添加任何内容?

在我的 swift 文件中,我无法访问 dstatecstate

编译器在 g722_coder_init(&dstate) 行显示“使用未解析的标识符‘dstate’”。

Compiler error

头文件

#ifdef __cplusplus
extern "C" {
#endif

extern struct g722_dstate dstate;
extern struct g722_cstate cstate;

int g722_coder_init (  struct g722_cstate *s  );
int g722_encode(short *data, unsigned char *outdata,int len, struct g722_cstate *s  );
int g722_decoder_init (  struct g722_dstate *s);
int  g722_decode(unsigned char *decdata, short *pcmout, int len,  struct g722_dstate *s );

#ifdef __cplusplus
}
#endif

桥接头

#import "g722_codec.h"

最佳答案

问题是 struct g722_dstate 是一个“不完整的类型”, 而 Swift 不能导入不完整类型的变量,只能导入变量 这是指向不完整类型的指针(并且那些是导入的 作为 OpaquePointer)。

将完整的结构定义添加到导入的头文件中 是最简单的解决方案。

如果那不可能,那么一种解决方法是添加

#import "g722_codec.h"

static struct g722_dstate * __nonnull dstatePtr = &dstate;

到桥接头文件,它定义了一个包含 “不透明”dstate 变量的地址。这被导入到 Swift 中作为

var dstatePtr: OpaquePointer

然后可以使用,例如作为

g722_coder_init(dstatePtr)

关于swift - 快速访问C变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43365067/

相关文章:

ios - 自动布局问题 Xcode 8 [_SwiftValue nsli_superitem]

c - 在 header 和源代码中都包含 <stdbool.h> 吗?

ios - 删除 UITableViewCell 时更新 firebase 中的数据

javascript - 使用 evaluateJavaScript 从 WKWebView 获取标题

ios - ios - 如何在ios swift中使用自动布局以编程方式将两个标签并排放置在中心和间距?

ios - Swift 4 中无法使用 'Self' 类型的索引为 'Int' 类型的值添加下标吗?

swift - ~>(波浪号大于)在此 Swift 代码中是什么意思?

ios - swift3 中的 Button.titleLabel 错误

c - 在 header 中声明枚举,在源文件中不可见?

html - 无法在标题的同一行中获取 Logo 和导航栏