Swift使用c结构

对不起标题,我找不到用几句话来形容我的问题。

我已经知道swift可以使用c编写的struct。 例如

在Bridging-Header.h中

typedef struct { int x; int y; } Pointer; 

然后我可以直接使用Pointer。

但就我而言,我有一个用C语言编写的库。有许多带有隐藏工具的结构。 例如:
在Briding-Header.h中

 typedef struct Pointer Pointer; 

我不能再使用Pointer了,得到了未知类型。 在我的库中,Pointer用作

 create_pointer(Pointer **pointer); 

任何帮助表示赞赏!

PS我没有定义struct Pointer的.h文件。 关于Pointer的所有细节都是隐藏,例如通过函数访问它们

 int getx(Pointer *pointer); 

这是我的完整测试代码:
user_input.c

 #include  #include "user_input.h" struct Pointer { int x; int y; }; void get_user_input(int *user_input) { scanf("%i", user_input); } void init_pointer(Pointer *point) { point->x = 20; point->y = 20; } 

user_input.h

 #ifndef __user_input_h__ #define __user_input_h__ typedef struct Pointer Pointer; void init_pointer(Pointer *p); #endif 

转职Header.h

 #include "user_input.h" 

main.swift

 import Foundation var pointer:Pointer = Pointer(x:10, y:20) 

Xcode给我这个错误:指针未定义

转职Header.h

 #include "user_input.h" 

user_input.c

 #include  struct Pointer { int x; int y; }; Pointer *create_pointer() { Pointer *p = malloc(sizeof(struct Pointer)); if (p) { p->x = 20; p->y = 20; } return p; } void delete_pointer(Pointer *p) { free(p); } int pointer_x(Pointer *p) { return p->x; } int pointer_y(Pointer *p) { return p->y; } 

user_input.h

 #ifndef __user_input_h__ #define __user_input_h__ typedef struct Pointer Pointer; Pointer *create_pointer(); void delete_pointer(Pointer *p); int pointer_x(Pointer *p); int pointer_y(Pointer *p); #endif 

main.swift

 import Foundation var pointer: COpaquePointer = create_pointer() println("\(pointer_x(pointer)), \(pointer_y(pointer))") delete_pointer(pointer) // Writing the wrapper class could be helpful. class CPointer { var _ptr: COpaquePointer init() { _ptr = create_pointer() assert(_ptr, "Failed on create_pointer()") } deinit { delete_pointer(_ptr) } var x: Int { get { return Int(pointer_x(_ptr)) } } var y: Int { get { return Int(pointer_y(_ptr)) } } } var p = CPointer() println("\(px), \(py)") 

如果在___ Bridging-Header.h中包含Pointer类型定义的原始标题,则应该没问题

因此,例如,如果你有foo.h,你声明你的结构和你的函数,那么而不是在你的桥接头中做任何额外的typdef调用#import foo.h

然后你的Swift代码应该能够看到foo.h中声明的符号

更新:

你需要什么:

  1. 假设“foo.h”是指针类型定义的头文件。 还要说“foo.c”是实现createPointer()的文件。
  2. 您需要在Xcode中创建一个Swift项目。 将“foo.h”和“foo.c”添加到项目中。
  3. 将头文件添加到名为“foo-Bridging-Header.h”的项目中(有时Xcode会询问您是否要在向项目添加.c或.m文件时创建桥接头,但是使用Developer Seed I避风港观察到这一点仍然是一致的。
  4. 在“foo-Bridging-Header.h”中,你需要#include foo.h
  5. 完成此操作后,您应该可以从项目中的“main.swift”文件中调用“foo.h”中的任何符号。

例如,我有一个Swift项目。 在这个项目中,我有一个Swift文件(main.swift),一个C头文件(test.h),一个C源文件(test.c)和一个Bridging Header(test-Bridging-Header.h)。

他们的内容如下:

  1. test.h:
 void printFoo(); 
  1. test.c的:
 #include  #include "test.h" void printFoo() { printf("foo\n"); } 
  1. 测试桥接-Header.h:
 #import "test.h" 
  1. main.swift:
 import Foundation println("Hello, World!") printFoo() 

运行时,输出:

 Hello, World! foo 

在改变我的问题之后,我得到了答案。

当struct在hidden中实现时,这被称为“不透明”

所以我可以使用COpaquePointer。

 var pointer: COpaquePointer = COpaquePointer.null() // some init code. init_pointer(pointer);