Ios 快速铸造非女性指针<;无效>;在C中回调

Ios 快速铸造非女性指针<;无效>;在C中回调,ios,c,swift,casting,Ios,C,Swift,Casting,尝试使用swift与iOS AudioQueues接口,并在试图传递定义我的状态的对象时遇到障碍 My state对象是一个自定义结构,定义为: struct UserData { var active: Bool = false var audioFileId: AudioFileID = nil } 我的swift音频输入回调: let myCallback : @convention(c) (UnsafeMutablePointer<Void>, AudioQ

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

My state对象是一个自定义结构,定义为:

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
      ...
    }
我陷入困境的是如何将
inUserData:UnsafemeutablePointer
强制转换到我的UserData结构

当然,还有更好的处理方法

谢谢

您可以使用

let userData: UserData = UnsafePointer(inUserData).memory

let userData=UnsafePointer(inUserData)。内存
两者是等价的。另见

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

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

您也可以直接修改
userDataReference.memory
,但我建议您不要这样做。

很抱歉添加一个。是否可以在回调中修改结构的属性?给定一个附加属性var packetsProcessed:Int64=0,并且能够在回调中设置它
let userData = UnsafePointer<UserData>(inUserData).memory
let userDataReference = UnsafeMutablePointer<UserData>(inUserData)
var userData = userDataReference.memory
userData.… = … /* modifiy local copy */
userDataReference.memory = userData