Swift UnsafeMutablePointer <Unmanaged <CFString>?> Zuweisung und Drucken

Ich bin neu in Swift und habe einige Schwierigkeiten, mit Zeigern von nicht verwaltetem CFString (oder NSString) umzugehen. Ich arbeite an einem CoreMIDI-Projekt, das die Verwendung von UnsafeMutablePointer impliziert?> Wie Sie in dieser Funktion sehen können:

func MIDIObjectGetStringProperty(_ obj: MIDIObjectRef,
                           _ propertyID: CFString!,
                           _ str: UnsafeMutablePointer<Unmanaged<CFString>?>) -> OSStatus

Mein Problem ist, dass ich einen Puffer zuweisen möchte, um den Inhalt der Eigenschaft (_str) zu empfangen, dann die obige Funktion aufrufe und schließlich den Inhalt in der Konsole mit println drucke.

m Moment habe ich folgendes geschrieben:

// Get the first midi source (I know it exists)
var midiEndPoint : Unmanaged<MIDIEndpointRef> = MIDIGetSource(0)

//C reate a "constant" of 256
let buf = NSMutableData(capacity: 256) 

// Allocate a string buffer of 256 characters (I'm not even sure this does what I want)
var name = UnsafeMutablePointer<Unmanaged<CFString>?>(buf!.bytes)

// Call the function to fill the string buffer with the display name of the midi device
var err : OSStatus =  MIDIObjectGetStringProperty(&midiEndPoint,kMIDIPropertyDisplayName,name)

// Print the string ... here no surprises I don't know what to write to print the content of the pointer, so it prints the address for the moment
println(name)

Ich habe keinen Beispielcode für die Verwendung der CoreMIDI-Funktionen in der Apple-Entwicklerbibliothek gefunden, der nicht im Internet verfügbar ist. Ich bin wirklich verwirrt, weil ich von CPP komme und die Dinge in Swift ganz anders sind.

EDIT:

Nachdem Rintaro und Martin geantwortet haben, habe ich immer noch ein Problem. Alle meine Tests wurden unter iOS 8.1 durchgeführt. Wenn ich den von Ihnen mitgebrachten Code kopiere, teilt mir der Compiler mit, dass ich nicht schreiben kann:

let err = MIDIObjectGetStringProperty(midiEndPoint, kMIDIPropertyDisplayName, &property)

Results in 'Unmanaged' kann nicht in 'MIDIObjectRef' konvertiert werden. Also habe ich ein "&" hinzugefügt, weil MIDIObjectRef ein UnsafeMutablePointer <void> ist.

let midiEndPoint = MIDIGetSource(0)
var property : Unmanaged<CFString>?
let err = MIDIObjectGetStringProperty(&midiEndPoint, kMIDIPropertyDisplayName, &property)

Now: 'Nicht verwalteter <MIDIEndpoint>' kann nicht in '@ Wert inout $ T2' konvertiert werden. Zum Schluss musste ich das erstmal auf var umstellen, ohne zu verstehen warum?!?

var midiEndPoint = MIDIGetSource(0)
var property : Unmanaged<CFString>?
let err = MIDIObjectGetStringProperty(&midiEndPoint, kMIDIPropertyDisplayName, &property)

Der Code wird jetzt kompiliert und ausgeführt, aber MIDIObjectGetStringProperty gibt OSStatus err -50 zurück, was IOW oder MacErros.h entspricht:

paramErr  = -50,  /*error in user parameter list*/

So scheint es, dass die Parameter nicht die sind, auf die MIDIObjectGetStringProperty wartet.

Die Quelle "0" existiert auf meinem iPad, weil MIDIGetNumberOfSources () 1 zurückgibt. Hier ist der vollständige Code:

var numDestinations: ItemCount = MIDIGetNumberOfDestinations()
    println("MIDI Destinations : " + String(numDestinations))

    for var i : ItemCount = 0 ; i < numDestinations; ++i{
        var midiEndPoint = MIDIGetDestination(i)

        var property : Unmanaged<CFString>?
        let err = MIDIObjectGetStringProperty(&midiEndPoint, kMIDIPropertyDisplayName, &property)
        if err == noErr {
            let displayName = property!.takeRetainedValue() as String
            println(displayName)
        }else{
            println("error : "+String(err))
        }
   }

Anzeigen:

MIDI Destinations : 1
error : -50

Ich verstehe wirklich nichts ...

UPDATE:

Finally Martin fand die Lösung, es scheint, dass es zwei verschiedene Definitionen von MIDIObjectRef in 32- und 64-Bit-Architekturen gibt. Als ich den Code auf einem alten iPad 2 ausführte, versuchte mein Code, im 32-Bit-Modus zu kompilieren, in dem der MIDIGetSource (i) -Rückgabewert nicht in MIDIObjectRef konvertierbar ist. Die Lösung besteht darin, den Midi-Endpunkt auf 32-Bit-Architekturen "unsicher" zu setzen:

#if arch(arm64) || arch(x86_64)
    let midiEndPoint = MIDIGetDestination(i)
#else
    let midiEndPoint = unsafeBitCast(MIDIGetDestination(i), MIDIObjectRef.self)
#endif

... oder ein neues 64bit Gerät kaufen ...

Danke für die wertvolle Hilfe

Antworten auf die Frage(2)

Ihre Antwort auf die Frage