簡體   English   中英

Swift使用c結構

[英]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中聲明的符號

更新:

你需要什么:

  1. 假設“foo.h”是指針是類型定義的頭文件。 還要說“foo.c”是實現createPointer()的文件。
  2. 您需要在Xcode中創建一個Swift項目。 將“foo.h”和“foo.c”添加到項目中。
  3. 將一個頭文件添加到名為“foo-Bridging-Header.h”的項目中(有時Xcode會詢問您是否要在向項目添加.c或.m文件時創建橋接頭,但是使用Developer Seed I避風港但是觀察到它仍然是一致的。
  4. 在“foo-Bridging-Header.h”中,你需要#include foo.h
  5. 完成此操作后,您應該可以從項目中的“main.swift”文件中調用“foo.h”中的任何符號。

例如,我有一個Swift項目。 在這個項目中,我有一個Swift文件(main.swift),一個C頭文件(test.h),一個C源文件(test.c)和一個Bridging Header(test-Bridging-Header.h)。

他們的內容如下:

  1. test.h:
 void printFoo(); 
  1. test.c的:
 #include <stdio.h> #include "test.h" void printFoo() { printf("foo\\n"); } 
  1. 測試橋接-Header.h:
 #import "test.h" 
  1. main.swift:
 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM