Я пытаюсь преобразовать массив UInt16
в UnsafeMutablePointer<UInt16>
, чтобы вызвать функцию C, которая принимает uint16_t *
из Swift.
Если бы моей отправной точкой был [UInt8]
, а пунктом назначения UnsafeMutablePointer<UInt8>
, все было бы просто. Я мог бы преобразовать массив в Data
, оттуда в NSData
, вызвать bytes.assumingMemoryBound
, и на этом я (почти) закончил.
Однако, учитывая поставленную задачу, я рассматриваю несколько разных путей. Один из подходов заключается в преобразовании [UInt16]
в [UInt8]
, использовании того же пути данных, что и описанный выше, а затем указании другого типа в вызове assumingMemoryBound
.
Однако это оказывается более сложным, чем ожидалось. Есть куча вопросов о том, как преобразовать массив всего из двух UInt8
в один UInt16
; Я нашел один вопрос с вопросом, как преобразовать с одного UInt16
на два UInt8
, но все это, кажется, становится гораздо более сложным при преобразовании массивов.
Другой подход, который я пробую, состоит в том, чтобы просто взять значение массива [UInt16]
и попытаться преобразовать его в UnsafeMutablePointer<UInt16>
, используя промежуточный вызов withUnsafeBytes
или что-то в этом роде, но в Swift есть куча разных типов указателей, которые просто не совпадают. В частности, вот одна из моих предыдущих попыток:
array.withUnsafeBytes { (pointer: UnsafeRawBufferPointer) -> UnsafeMutablePointer<UInt16> in
let mutablePointer = UnsafeMutablePointer<UInt16>(mutating: pointer) // error
return mutablePointer
}
Однако это приводит к следующей ошибке:
Не удается преобразовать значение типа UnsafeRawBufferPointer в ожидаемый тип аргумента UnsafePointer.
Возможно, я просто еще не нашел правильный вопрос или нужную страницу документации, поэтому буду признателен за любые указатели в правильном направлении!