2016-11-25 76 views
1

铸造型“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

+0

'assumeMemoryBound(to:)'。原始指针不会像C中那样“投射”。 – CodaFi

+0

以下工作:'让aqp = inUserData!.assumingMemoryBound(to:Player.self).pointee'。谢谢。 –

+0

@BDWild不要修改问题以显示答案:_answer_问题(作为答案)。回答你自己的问题非常好。在48小时内,你甚至可以接受你自己的答案。 – matt

回答

2

'UnsafeMutablePointer' 以下修改消除了错误:

let aqp = inUserData!.assumingMemoryBound(to: Player.self).pointee 
+0

这是否最终为你工作? –

+0

是的,这对我有用。 –

0

转换MutableRawPointer到对象,我们使用fromOpaque API

​​

例如:

var info:UnsafeMutableRawPointer = .... 
let obj = Unmanaged<$AnyObject>.fromOpaque(info).takeUnretainedValue() 
+0

对于遇到此问题的任何人,请避免使用“Unmanaged”API,除非您需要控制指针值的ref参数(非常不会)。有制裁,类型安全的解决方案。 – CodaFi