我有一个当前具有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中访问该数组?
答案 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)
}