Как получить доступ в Swift C структура, которая содержит массив переменного размера? - PullRequest
0 голосов
/ 09 января 2019

У меня есть проект, который в настоящее время имеет структуру 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 голосов
/ 10 января 2019

Массивы нулевой длины в 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...