Быстрое приведение Unsafemutable Pointer в C callback
Попытка взаимодействия с Аудиоквестами iOS с помощью swift и столкновение с блокпостом при попытке передать объект, определяющий мое состояние.
Мой объект состояния-это пользовательская структура, определенная следующим образом:
struct UserData {
var active: Bool = false
var audioFileId: AudioFileID = nil
}
Мой быстрый обратный вызов аудиовхода:
let myCallback : @convention(c) (UnsafeMutablePointer<Void>, AudioQueueRef, AudioQueueBufferRef, UnsafePointer<AudioTimeStamp>, UInt32, UnsafePointer<AudioStreamPacketDescription>) -> Void = {
(inUserData, inAQ, inBuffer, inStartTime, inNumberPacketDescriptions, inPacketDescs) -> Void in
...
}
Наконец, инициализация звуковой очереди:
AudioQueueNewInput(&audioStreamBasicDescription, myCallback, &userData, nil, nil, 0, &inputQueue)
Где я застрял, это выяснение того, как привести inUserData: UnsafeMutablePointer<Void>
к моей структуре UserData
Или, Конечно, любой лучший способ справиться с этим.
Спасибо!
1 ответ:
Вы можете использовать либо
let userData: UserData = UnsafePointer(inUserData).memory
Или
let userData = UnsafePointer<UserData>(inUserData).memory
Оба эквивалентны. См. также UnsafeMutablePointer ссылочная структура.
Для возврата некоторых измененных данных можно использовать
let userDataReference = UnsafeMutablePointer<UserData>(inUserData) var userData = userDataReference.memory userData.… = … /* modifiy local copy */ userDataReference.memory = userData
Вы также можете изменить
userDataReference.memory
напрямую, но я бы не советовал этого делать.