Swift使用c结构

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)


ale*_*lin 1

如果您在 ___Bridging-Header.h 中包含 Pointer 已 typedef 的原始标头,则应该没问题

因此,例如,如果您在 foo.h 中声明您的结构和函数,那么您不必在桥接标头中执行任何额外的typdef调用#import foo.h

那么你的 Swift 代码应该能够看到 foo.h 中声明的符号

更新:

您需要什么:

  1. 假设“foo.h”是指针类型定义的头文件。还要说“foo.c”是实现createPointer() 的文件。
  2. 您需要在 Xcode 中创建一个 Swift 项目。将“foo.h”和“foo.c”添加到项目中。
  3. 将一个名为“foo-Bridging-Header.h”的头文件添加到项目中(有时,当您将 .c 或 .m 文件添加到项目中时,Xcode 会询问您是否要创建桥接头文件,但使用 Developer Seed 我还没有尚未观察到这是一致的)。
  4. 在“foo-Bridging-Header.h”中,您需要#include foo.h
  5. 完成此操作后,您应该能够从项目中的“main.swift”文件中调用“foo.h”中的任何符号。

例如,我有一个 Swift 项目。在这个项目中,我有一个 Swift 文件 (main.swift)、一个 C 标头 (test.h)、一个 C 源文件 (test.c) 和一个桥接标头 (test-Bridging-Header.h)。

它们的内容如下:

  1. 测试.h:
void
printFoo();
Run Code Online (Sandbox Code Playgroud)
  1. 测试.c:
#include <stdio.h>
#include "test.h"

void
printFoo() {
    printf("foo\n");
}
Run Code Online (Sandbox Code Playgroud)
  1. 测试桥接标题.h:
#import "test.h"
Run Code Online (Sandbox Code Playgroud)
  1. 主要.swift:
import Foundation

println("Hello, World!")

printFoo()
Run Code Online (Sandbox Code Playgroud)

运行时,输出:

Hello, World!
foo
Run Code Online (Sandbox Code Playgroud)