Быстрое приведение 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 2

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 напрямую, но я бы не советовал этого делать.