[英]Swift use c struct
對不起標題,我找不到用幾句話來形容我的問題。
我已經知道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 <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;
}
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 <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;
}
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("\(p.x), \(p.y)")
如果在___ Bridging-Header.h中包含Pointer類型定義的原始標題,則應該沒問題
因此,例如,如果你有foo.h,你聲明你的結構和你的函數,那么不要在你的橋接頭中進行任何額外的typdef調用#import foo.h
然后你的Swift代碼應該能夠看到foo.h中聲明的符號
更新:
你需要什么:
#include foo.h
例如,我有一個Swift項目。 在這個項目中,我有一個Swift文件(main.swift),一個C頭文件(test.h),一個C源文件(test.c)和一個Bridging Header(test-Bridging-Header.h)。
他們的內容如下:
void printFoo();
#include <stdio.h> #include "test.h" void printFoo() { printf("foo\\n"); }
#import "test.h"
import Foundation println("Hello, World!") printFoo()
運行時,輸出:
Hello, World! foo
在改變我的問題后,我得到了答案。
當struct在hidden中實現時,這被稱為“不透明”
所以我可以使用COpaquePointer。
var pointer: COpaquePointer = COpaquePointer.null()
// some init code.
init_pointer(pointer);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.