2015-04-10 9 views
9

Gibt es eine Möglichkeit, die Adresse einer Swift-Struktur in einen ungültigen UnsafeMutablePointer zu konvertieren?
Ich habe versucht, dies ohne Erfolg:Umwandeln einer Swift-Struktur in UnsafeMutablePointer <Void>

struct TheStruct { 
    var a:Int = 0 
} 

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

Dank!

EDIT: der Kontext
Ich versuche tatsächlich in den Hafen Swift das erste Beispiel in Learning CoreAudio-.
Dies ist, was ich bisher getan habe:

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) 

Ich Anstrengungen mache in Swift zu bleiben, aber wenn dies ein Problem ist als ein Vorteil mehr erweist, werde ich zu einer C-Funktion am Ende Verknüpfung .

EDIT: bottome Linie
Wenn Sie auf diese Frage kam, weil Sie versuchen, eine CoreAudio- des Audioqueue in Swift verwenden ... nicht. (Lesen Sie die Kommentare für Details)

+0

Können Sie einige Informationen hinzufügen * warum * die Adresse als Void-Zeiger benötigt wird? –

+0

Sicher! Ich versuche CoreAudio in Swift zu verwenden. Der Compiler beschwert sich, dass die an AudioQueueNewInput übergebenen Argumente nicht das sind, was sie sein sollten, und die Struktur als die Ursache davon übergeben wird. – popisar

+0

Sie sollten der Frage weitere Informationen und Code hinzufügen. Welche Funktion genau, wie versuchst du es zu nennen, die genaue Fehlermeldung ... –

Antwort

11

Soweit ich weiß, ist der kürzeste Weg ist:

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

Aber warum diese brauchen? Wenn Sie es als Parameter übergeben möchten, können (und sollten) Sie:

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

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

Die erste Variante ist wirklich unsicher, da der Zeiger über die Lebensdauer von' myStruct' hinaus verwendet werden kann. - Wenn der Zeiger als Argument für ein C-Funktion dann 'withUnsafeMutablePointer (& myStruct) {someCFunction (UnsafeMutablePointer ($ 0))}' ist auch eine Option. –

+0

Wir passieren kann 'UnsafeMutablePointer ' als 'UnsafeMutablePointer '. so 'withUnsafeMutablePointer (& myStruct) {someCFunction ($ 0)} funktioniert auch – rintaro

+1

@MartinR Warum hat es "unsafe" in der Art Name :) – Kirsteins