2015-04-10 15 views
9

C'è un modo per trasmettere l'indirizzo di una struct Swift a un unsafeMutablePointer?
Ho provato questo senza successo:Lancia una struttura Swift a UnsafeMutablePointer <Void>

struct TheStruct { 
    var a:Int = 0 
} 

var myStruct = TheStruct() 
var address = UnsafeMutablePointer<Void>(&myStruct) 

Grazie!

EDIT: il contesto
sto effettivamente cercando di porto a Swift il primo esempio in Learning CoreAudio.
Questo è quello che ho fatto fino ad ora:

func myAQInputCallback(inUserData:UnsafeMutablePointer<Void>, 
    inQueue:AudioQueueRef, 
    inBuffer:AudioQueueBufferRef, 
    inStartTime:UnsafePointer<AudioTimeStamp>, 
    inNumPackets:UInt32, 
    inPacketDesc:UnsafePointer<AudioStreamPacketDescription>) 
{ } 

struct MyRecorder { 
    var recordFile:  AudioFileID = AudioFileID() 
    var recordPacket: Int64  = 0 
    var running:  Boolean  = 0 
} 

var queue:AudioQueueRef = AudioQueueRef() 
AudioQueueNewInput(&asbd, 
    myAQInputCallback, 
    &recorder, // <- this is where I *think* a void pointer is demanded 
    nil, 
    nil, 
    UInt32(0), 
    &queue) 

sto facendo sforzi per rimanere a Swift, ma se questo si rivela essere più un problema che un vantaggio, mi finirà per il collegamento a una funzione C .

EDIT: linea bottome
Se siete venuti a questa domanda, perché si sta tentando di utilizzare AudioQueue di un CoreAudio a Swift ... non lo fanno. (Leggi i commenti relativi dettagli)

+0

Puoi aggiungere alcune informazioni * perché * l'indirizzo è necessario come puntatore vuoto? –

+0

Sicuro! Sto cercando di utilizzare CoreAudio in Swift. Il compilatore si lamenta che gli argomenti passati a AudioQueueNewInput non sono quello che dovrebbero essere, e la struttura passata sembra essere la causa di. – popisar

+0

Dovresti aggiungere ulteriori informazioni e codice alla domanda. Quale funzione esattamente, come si prova a chiamare, l'esatto messaggio di errore ... –

risposta

11

Per quanto ne so, la via più breve è:

var myStruct = TheStruct() 
var address = withUnsafeMutablePointer(&myStruct) {UnsafeMutablePointer<Void>($0)} 

Ma, perché avete bisogno di questo? Se vuoi passarlo come parametro, puoi (e dovrebbe):

func foo(arg:UnsafeMutablePointer<Void>) { 
    //... 
} 

var myStruct = TheStruct() 
foo(&myStruct) 
+2

La prima variante è davvero pericolosa perché il puntatore potrebbe essere utilizzato oltre la durata di' myStruct'. - Se il puntatore è necessario come argomento per un funzione C poi 'withUnsafeMutablePointer (& myStruct) {someCFunction (UnsafeMutablePointer ($ 0))}' è anche un'opzione. –

+0

possiamo passare 'UnsafeMutablePointer ' come 'UnsafeMutablePointer '. Così 'withUnsafeMutablePointer (& myStruct) {someCFunction ($ 0)} 'funziona anche – rintaro

+1

@MartinR Che motivo ha" non sicuro "nel nome del tipo :) – Kirsteins

Problemi correlati