繁体   English   中英

快速访问 C 结构体

[英]Swift access to C Struct

我正在开发一个用于解析 cvs 文件的 OS X Swift 应用程序。 它在 Objective-C 中成功运行。 然后我改用 Swift,为了性能改进,我用 C 开发了解析/导入引擎。它比 Swift 或 Objective-C 快 5 倍 - 很好。 但是我很难在 C 和 Swift 之间交换数据——尤其是使用 Struct:

桥接头:

#include "ToolBoxC.h"

工具箱C.h:

void loadFile(const char *fileName, const char *delimiters, const char *xRegex, int xRegexColumn, int xColumn, int yColumn, int xRow, int yRowShift, bool collectStrings);

typedef struct {

                    char **headerArray;
                    int numberHeaderRows;
                    char **dateArray;
                    int numberDateRows;
                    int **valueArray;
                    char ***stringArray;
                    int numberValueRows;
                    int numberValueColums;
        } FileStruct;

typedef struct {

                    FileStruct fileContent[10000];
} FilesStruct;

struct FilesStruct filesContent;

工具箱C.c:

struct FileStruct {

    char **headerArray;
    int numberHeaderRows;
    char **dateArray;
    int numberDateRows;
    int **valueArray;
    char ***stringArray;
    int numberValueRows;
    int numberValueColums;
};

struct FilesStruct {

    struct FileStruct fileContent[10000];
};

void loadFile(const char *fileName, const char *delimiters, const char *xRegex, int xRegexColumn, int xColumn, int yColumn, int xRow, int yRowShift, bool collectStrings) {

// some stuff

    struct FileStruct fileContent;

    fileContent.headerArray = headerArray;
    fileContent.numberHeaderRows = numberHeaderRows;
    fileContent.dateArray = dateArray;
    fileContent.numberDateRows = numberDateRows;
    fileContent.valueArray = valueArray;
    fileContent.stringArray = stringArray;
    fileContent.numberValueRows = numberValueRows;
    fileContent.numberValueColums = numberValueColumns;

    filesContent.fileContent[numberFiles] = fileContent;

return;
}

所有解析的数据都存储在struct FilesStruct filesContent 解析是通过调用带有 Swift 参数的函数 loadFile() 开始的。 这很好用。 解析也OK。 但是如何从 Swift 访问struct FilesStruct filesContent的数据?

谢谢,马蒂亚斯。

尝试这个:

工具箱C.h

#include <stdbool.h>

struct FileStruct {
    char **headerArray;
    int numberHeaderRows;
    char **dateArray;
    int numberDateRows;
    int **valueArray;
    char ***stringArray;
    int numberValueRows;
    int numberValueColums;
};

extern struct FileStruct **loadedFiles;

void loadFile(const char *fileName, const char *delimiters, const char *xRegex, int xRegexColumn, int xColumn, int yColumn, int xRow, int yRowShift, bool collectStrings);

工具箱C.c

#include <stdlib.h>
#include "ToolBoxC.h"

#define MaxFiles 10000

struct FileStruct **loadedFiles;

void loadFile(const char *fileName, const char *delimiters, const char *xRegex, int xRegexColumn, int xColumn, int yColumn, int xRow, int yRowShift, bool collectStrings) {

    static int nextIndex = 0;

    if (loadedFiles == 0)
        loadedFiles = malloc(MaxFiles * sizeof(*loadedFiles));

    struct FileStruct *file = malloc(sizeof(struct FileStruct));
    file->numberDateRows = xRow;

    loadedFiles[nextIndex++] = file;
}

Swift 测试方法

func loadFilesTest() -> Void {
    for var i:Int32 = 0; i < 10; ++i {
        loadFile("", "", "", 0, 0, 0, i, 0, true)
    }
    for var j = 0; j < 10; ++j {
        let pointer = UnsafePointer<FileStruct>(loadedFiles[j])
        print("Number of date rows = \(pointer.memory.numberDateRows)")
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM