Я изо всех сил, чтобы инициализировать структуру MIDIMetaEvent найденную в MusicPlayer.h с быстрым заголовочный файл не определяет структуру следующим образом:Initializing MIDIMetaEvent структура
struct MIDIMetaEvent {
var metaEventType: UInt8
var unused1: UInt8
var unused2: UInt8
var unused3: UInt8
var dataLength: UInt32
var data: (UInt8)
}
который кажется довольно простым вплоть до члена, что «данные». Является ли это 1-элементным определением кортежа? Я могу легко инициализировать все остальные элементы структуры, но тщетно пытался установить «данные» на что-либо еще, кроме одного значения. В моем коде я использовал массив Uint8 под названием MyData и попытался инициализировать структуру следующим образом:
var msg = MIDIMetaEvent(
metaEventType : UInt8(0x7F),
unused1 : UInt8(0),
unused2 : UInt8(0),
unused3 : UInt8(0),
dataLength : UInt32(myData.count),
data : UnsafeBufferPointer<UInt8>(start: UnsafePointer<UInt8>(myData), count:myData.count))
Но компилятор не доволен этим и жалуется на «UnsafeBufferPointer не конвертируемых в Uint8». Если я просто устанавливаю данные на одно значение, но устанавливаю значение dataLength на значение больше 1, то полученная в результате MIDIEventData показывает, что первое значение в событии - это то, что я застрял в «данных», за которым следуют баб данных данных в соответствии с байтами dataLength , Таким образом, «данные» воспринимаются как некоторая непрерывная память.
Как я могу установить этот элемент данных в элементы UInt8 из массива?
Ах, не понимал, что мне нужно спуститься так низко. Я не использовал memcpy в возрасте! Вместо использования UnsafeMutablePointer <>, который вы продемонстрировали выше, я просто решил использовать memcpy (& msg.data, data, UInt (data.count)), который, кажется, работает нормально. Благодаря! Кажется, практическая работа с Swift по-прежнему является довольно грязным делом ... – Yohst
@Yohst: Вы правы, withUnsafeMutablePointer был излишне сложным. Я обновил ответ и добавил альтернативу memcpy(). Было бы проще, если бы Swift-сопоставление массивов C было бы Swift Array вместо кортежа. –
Хммм, я победил слишком рано. Приведенный выше код приводит к копированию только первого байта «данных» на выход. Weird. Когда я исследую память сразу после memcpy() с mem.advancedBy (x) .memory с «x» - 8, 9, 10 и т. Д. Я вижу только первый байт в позиции «8», но бред для остальных. Что такое memcpy()? Или на что-то еще наступила память? – Yohst