在夫特3
铸造型“UnsafeMutableRawPointer”的一个变量来UnsafeMutablePointer <>一类定义开始如下:在夫特3
class Player {
var playbackFile: AudioFileID? = nil
var packetPosition: Int64 = 0
var numPacketsToRead: UInt32 = 0
var packetDescs: UnsafeMutablePointer<AudioStreamPacketDescription>? = nil
var isDone = false
}
然后定义的回调函数:
let AQOutputCallback: AudioQueueOutputCallback = {(inUserData, inAQ, inCompleteAQBuffer) ->() in
let aqp = UnsafeMutablePointer<Player>(inUserData).pointee // this gives an error
// more code
}
这导致第二行错误:“不能调用类型为'UnsafeMutableRawPointer?'的参数列表'UnsafeMutablePointer'的初始化程序。
如何从类型'UnsafeMutableRawPointer'正确投射?到在夫特3
'UnsafeMutablePointer' 以下修改消除了错误:
let aqp = inUserData!.assumingMemoryBound(to: Player.self).pointee
这是否最终为你工作? –
是的,这对我有用。 –
转换MutableRawPointer到对象,我们使用fromOpaque API
例如:
var info:UnsafeMutableRawPointer = ....
let obj = Unmanaged<$AnyObject>.fromOpaque(info).takeUnretainedValue()
对于遇到此问题的任何人,请避免使用“Unmanaged”API,除非您需要控制指针值的ref参数(非常不会)。有制裁,类型安全的解决方案。 – CodaFi
'assumeMemoryBound(to:)'。原始指针不会像C中那样“投射”。 – CodaFi
以下工作:'让aqp = inUserData!.assumingMemoryBound(to:Player.self).pointee'。谢谢。 –
@BDWild不要修改问题以显示答案:_answer_问题(作为答案)。回答你自己的问题非常好。在48小时内,你甚至可以接受你自己的答案。 – matt