我有一个项目当前有一个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访问该数组?

最佳答案

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

关于arrays - 如何在Swift中访问包含可变大小数组的C结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54101980/

10-09 09:28