Как с помощью Swift передать UUID функции C, которая принимает uuid_t?
Скажем, у меня в заголовке моста объявлена следующая функция:
bool my_set_uuid(uuid_t uuid);
И в Swift я пытаюсь передать ему новый UUID:
let uuid = UUID()
my_set_uuid(uuid.uuid)
Я получаю следующую ошибку: «Невозможно преобразовать значение типа 'uuid_t' (aka '(UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8, UInt8 ) ') к ожидаемому типу аргумента' UnsafeMutablePointer! '"
Я знаю, что это потому, что UUID.uuid имеет тип uuid_t, который реализован как массив C из 16 байтов, который становится кортежем из 16 UInt8 в Swift. Но почему я не могу передать C uuid_t в C? Вроде ожидает указателя.
Итак, я пытаюсь создать указатель на свой uuid с помощью withUnsafeMutableBytes. Я обнаружил, что это сработало:
let _: UInt8 = withUnsafeMutablePointer(to: &uuid.0) { ptr in
my_set_uuid(ptr)
return 0
}
Но я также читал, что & uuid.0 небезопасно, потому что я использую весь кортеж (как массив) в своей функции C. Кроме того, все переодевания, которые мне приходилось делать с let _: UInt8
и return 0
, кажется неправильным.