2016-11-25 53 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