gal*_*lio 11 c struct pointers swift
对不起标题,我找不到用几句话来形容我的问题.
我已经知道swift可以使用c编写的struct.例如
在Bridging-Header.h中
typedef struct {
int x;
int y;
} Pointer;
Run Code Online (Sandbox Code Playgroud)
然后我可以直接使用Pointer.
但就我而言,我有一个用C语言编写的库.有许多带有隐藏工具的结构.例如:
在Briding-Header.h中
typedef struct Pointer Pointer;
Run Code Online (Sandbox Code Playgroud)
我不能再使用Pointer了,得到了未知类型.在我的库中,Pointer用作
create_pointer(Pointer **pointer);
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏!
PS我没有定义struct Pointer的.h文件.关于Pointer的所有细节都是隐藏,例如,通过函数访问它们
int getx(Pointer *pointer);
Run Code Online (Sandbox Code Playgroud)
这是我的完整测试代码:
user_input.c
#include <stdio.h>
#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;
}
Run Code Online (Sandbox Code Playgroud)
user_input.h
#ifndef __user_input_h__
#define __user_input_h__
typedef struct Pointer Pointer;
void init_pointer(Pointer *p);
#endif
Run Code Online (Sandbox Code Playgroud)
转职Header.h
#include "user_input.h"
Run Code Online (Sandbox Code Playgroud)
main.swift
import Foundation
var pointer:Pointer = Pointer(x:10, y:20)
Run Code Online (Sandbox Code Playgroud)
Xcode给我这个错误:指针未定义
kro*_*sse 11
转职Header.h
#include "user_input.h"
Run Code Online (Sandbox Code Playgroud)
user_input.c
#include <stdlib.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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("\(p.x), \(p.y)")
Run Code Online (Sandbox Code Playgroud)
如果您在 ___Bridging-Header.h 中包含 Pointer 已 typedef 的原始标头,则应该没问题
因此,例如,如果您在 foo.h 中声明您的结构和函数,那么您不必在桥接标头中执行任何额外的typdef调用#import foo.h
那么你的 Swift 代码应该能够看到 foo.h 中声明的符号
更新:
您需要什么:
#include foo.h例如,我有一个 Swift 项目。在这个项目中,我有一个 Swift 文件 (main.swift)、一个 C 标头 (test.h)、一个 C 源文件 (test.c) 和一个桥接标头 (test-Bridging-Header.h)。
它们的内容如下:
Run Code Online (Sandbox Code Playgroud)void printFoo();
Run Code Online (Sandbox Code Playgroud)#include <stdio.h> #include "test.h" void printFoo() { printf("foo\n"); }
Run Code Online (Sandbox Code Playgroud)#import "test.h"
Run Code Online (Sandbox Code Playgroud)import Foundation println("Hello, World!") printFoo()
运行时,输出:
Run Code Online (Sandbox Code Playgroud)Hello, World! foo