Swift 强制转换<Void> C 回调中的 UnsafeMutablePointer



尝试使用swift与iOS AudioQueues接口,并在尝试通过定义我的状态的对象时遇到障碍。

我的状态对象是一个自定义结构,定义为:

struct UserData {
var active: Bool = false
var audioFileId: AudioFileID = nil
}

我的swift音频输入回调:

        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结构

或者,当然,任何更好的处理方式。

谢谢!

您可以使用任一

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,但我建议不要这样做。

最新更新