如何在Swift中访问包含可变大小数组的C结构?

时间:2019-01-09 01:17:03

标签: arrays swift struct

我有一个当前具有C结构的项目,该C结构已定义为:

typedef struct IDList {

    uint32_t   listID;
    uint32_t   count;
    uint32_t   idArray[];

} __attribute__((packed, aligned(4))) IDList, *IDListPtr;

Objective-C类中有一个方法可以向我返回IDListPtr。

我知道我可以做到:

let idListPtr = theIDManager.getIDList()    // ObjC class that returns the struct

let idList = idListPtr.pointee    // Get the IDList struct from the pointer

我知道结构的数组中有idList.count个项目,但是如何在Swift中访问该数组?

1 个答案:

答案 0 :(得分:1)

C中的零长度数组在Swift中不可见。可能的解决方法是在桥接头文件中添加一个辅助函数,该函数返回第一个数组项的地址:

static uint32_t * _Nonnull idArrayPtr(const IDListPtr _Nonnull ptr) { return &ptr->idArray[0]; }

现在您可以在Swift中创建一个引用可变长度数组的“缓冲区指针”:

let idListPtr = getIDList()
let idArray = UnsafeBufferPointer(start: idArrayPtr(idListPtr), count: Int(idListPtr.pointee.count))
for item in idArray {
    print(item)
}