Sorry for the title, I can't find words to describe my question in few words.
I already know that swift can use struct written in c. For example
In Bridging-Header.h
typedef struct {
int x;
int y;
} Pointer;
then I can use Pointer directly.
But in my case, I have a library written in C. There are many structs with hidden implement. For example:
In Briding-Header.h
typedef struct Pointer Pointer;
I can't use Pointer any more, got unknown type. In my library Pointer is used as
create_pointer(Pointer **pointer);
Any help is appreciated!
PS I have no .h file which define struct Pointer. All details about Pointer is hide, access them by function, for example
int getx(Pointer *pointer);
Here is my full test code:
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
Bridging-Header.h
#include "user_input.h"
main.swift
import Foundation
var pointer:Pointer = Pointer(x:10, y:20)
Xcode give me this error: Pointer undefined
Bridging-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)")
You should be OK if you include the original header where Pointer is typedef-ed in ___Bridging-Header.h
So for example if you have foo.h where you declare your struct and your functions, then instead of doing any additional typdef calls in your bridging header just #import foo.h
Then your Swift code should be able to see the symbols declared in foo.h
Update:
What you need:
#include foo.h
For example, I have a Swift project. In this project I have a Swift file (main.swift), a C header (test.h), a C source file (test.c), and a Bridging Header (test-Bridging-Header.h).
Their contents are as follows:
void printFoo();
#include <stdio.h> #include "test.h" void printFoo() { printf("foo\\n"); }
#import "test.h"
import Foundation println("Hello, World!") printFoo()
When run, this outputs:
Hello, World! foo
After change my question, I got an answer.
When the struct implements in hidden, this is called "opaque"
so I can use COpaquePointer.
var pointer: COpaquePointer = COpaquePointer.null()
// some init code.
init_pointer(pointer);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.