Swift在C回调中强制转换UnsafeMutablePointer <void>

时间:2015-11-10 13:03:16

标签: ios c swift casting

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

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

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 个答案:

答案 0 :(得分:2)

您可以使用

let userData: UserData = UnsafePointer(inUserData).memory

let userData = UnsafePointer<UserData>(inUserData).memory
两者都是等价的。另请参阅UnsafeMutablePointer Structure Reference

要返回一些修改后的数据,您可以使用

let userDataReference = UnsafeMutablePointer<UserData>(inUserData)
var userData = userDataReference.memory
userData.… = … /* modifiy local copy */
userDataReference.memory = userData

您也可以直接修改userDataReference.memory,但我会反对。