雨燕采用C结构 [英] Swift use c struct

查看:134
本文介绍了雨燕采用C结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

很抱歉的标题,我找不到词语来形容的几句话我的问题。

Sorry for the title, I can't find words to describe my question in few words.

我已经知道,迅速可以使用结构用C语言编写。例如:

I already know that swift can use struct written in c. For example

在转职Header.h

In Bridging-Header.h

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

然后我就可以直接使用指针。

then I can use Pointer directly.

但在我而言,我有C语言编写的一个图书馆有藏有很多实现结构。例如:结果
在Briding-Header.h

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);

任何帮助AP preciated!

Any help is appreciated!

P.S我有一个定义结构指针没有.h文件中。有关指针的所有细节是隐藏,按功能访问它们,例如:

P.S 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);

下面是我完整的测试code:结果
user_input.c

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

user_input.h

#ifndef __user_input_h__
#define __user_input_h__

typedef struct Pointer Pointer;

void init_pointer(Pointer *p);

#endif

桥接-Header.h

Bridging-Header.h

#include "user_input.h"

main.swift

main.swift

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

X $ C $ç给我这个错误:指针未定义

Xcode give me this error: Pointer undefined

推荐答案

转职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)")

这篇关于雨燕采用C结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆