快速使用c结构
很抱歉,我找不到用几个词来描述我的问题 我已经知道swift可以使用c语言编写的struct。比如说快速使用c结构,c,pointers,struct,swift,C,Pointers,Struct,Swift,很抱歉,我找不到用几个词来描述我的问题 我已经知道swift可以使用c语言编写的struct。比如说 int getx(Pointer *pointer); 在桥接头中 然后我可以直接使用指针 但在我的例子中,我有一个用C编写的库。有很多结构都有隐藏的实现。例如: 在连接头中 typedef struct Pointer Pointer; #include "user_input.h" 我不能再使用指针了,类型未知。在我的库中,指针用作 create_pointer(Pointer **
int getx(Pointer *pointer);
在桥接头中
然后我可以直接使用指针
但在我的例子中,我有一个用C编写的库。有很多结构都有隐藏的实现。例如:在连接头中
typedef struct Pointer Pointer;
#include "user_input.h"
我不能再使用指针了,类型未知。在我的库中,指针用作
create_pointer(Pointer **pointer);
感谢您的帮助
另外,我没有定义结构指针的.h文件。指针的所有细节都是隐藏的,例如,通过函数访问它们
int getx(Pointer *pointer);
这是我的完整测试代码:用户输入.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;
}
桥接头.h
typedef struct Pointer Pointer;
#include "user_input.h"
梅因·斯威夫特
import Foundation
var pointer:Pointer = Pointer(x:10, y:20)
Xcode告诉我这个错误:指针未定义如果在_u-header.h中包含指针类型定义的原始标头,则应该可以
typedef struct Pointer Pointer;
#include "user_input.h"
例如,如果有foo.h在其中声明结构和函数,那么不必在桥接头中进行任何额外的typdef调用,只需导入foo.h
那么您的Swift代码应该能够看到foo.h中声明的符号
更新:
您需要的:
#包括foo.h
在改变我的问题后,我得到了一个答案 当结构以隐藏方式实现时,这称为“不透明” 所以我可以用copaquepenter
var pointer: COpaquePointer = COpaquePointer.null()
// some init code.
init_pointer(pointer);
桥接头.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
#包括“user_input.h”
用户输入.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;
}
main.swift
<代码>导入基础
变量指针:COpaquePointer=create_pointer()
println(“\(指针x(指针)),\(指针y(指针))”)
删除指针(指针)
//编写包装器类可能会有所帮助。
类指针{
var_ptr:COpaquePointer
init(){
_ptr=创建_指针()
断言(_ptr,“创建_指针()时失败”)
}
脱硝{
删除指针(_ptr)
}
变量x:Int{
获取{returnint(指针_x(ptr))}
}
变量y:Int{
获取{return Int(指针_y(_ptr))}
}
}
var p=CPointer()
println(“\(p.x),\(p.y)”)
最重要的是我没有定义结构的.h,只有带typedef.Right的.h。这就是您要包含在桥接标头中的标题。我已测试但失败。你能给出一步一步的回答吗?我更新了我的答案。我不确定双指针等的规则是什么,但这应该允许您从Swift项目调用C代码。谢谢,我已经测试了您提到的方法。它起作用了。但是双指针仍然不起作用。作为我更新答案的补充,看来结构可能有问题。我一直在查看Xcode seed中的Swift文档,但找不到任何关于初始化类型定义结构并使用它们的明确内容。我留下我的答案是希望它能帮助尝试调用C函数的人,但结构似乎仍然是一个灰色区域;初始化指针(指针)这使得
指针指向内存中的任何地方,并导致init_pointer()
出现内存错误。如果Swift不知道C结构的形状,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;
}
#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