2014-09-02 11 views
6

Ho bisogno di un piccolo aiuto conversione di questobisogno di aiuto per la conversione (CFPropertyListRef *) NSDictionary a rapida

MIDIDeviceRef midiDevice = MIDIGetDevice(i); 
NSDictionary *midiProperties; 

MIDIObjectGetProperties(midiDevice, (CFPropertyListRef *)&midiProperties, YES); 
NSLog(@"Midi properties: %d \n %@", i, midiProperties); 

a rapida. Ce l'ho, ma mi sto bloccando a lanciare CFPropertList.

var midiDevice = MIDIGetDevice(index) 
let midiProperties = NSDictionary() 

MIDIObjectGetProperties(midiDevice, CFPropertyListRef(midiProperties), 1); 
println("Midi properties: \(index) \n \(midiProperties)"); 

Qualsiasi aiuto sarebbe fantastico.

Grazie

+0

Stai utilizzando oggetto costruito nel costante. È necessario un puntatore a NSDictionary, pertanto MIDIObjectGetProperties potrebbe creare oggetti e sovrascriverli, restituendo un valore. –

risposta

7

Questa è la firma per MIDIObjectGetProperties a Swift:

func MIDIObjectGetProperties(obj: MIDIObjectRef, outProperties: UnsafeMutablePointer<Unmanaged<CFPropertyList>?>, deep: Boolean) -> OSStatus 

Quindi è necessario passare in un UnsafeMutablePointer ad un Unmanaged<CFPropertyList>?:

var midiDevice = MIDIGetDevice(0) 
var unmanagedProperties: Unmanaged<CFPropertyList>? 

MIDIObjectGetProperties(midiDevice, &unmanagedProperties, 1) 

Ora avete le vostre proprietà, ma sono in una variabile non gestita: è possibile utilizzare il metodo takeUnretainedValue() per eliminarli e quindi eseguire il cast della risultante CFPropertyList a un NSDictionary:

if let midiProperties: CFPropertyList = unmanagedProperties?.takeUnretainedValue() { 
    let midiDictionary = midiProperties as NSDictionary 
    println("Midi properties: \(index) \n \(midiDictionary)"); 
} else { 
    println("Couldn't load properties for \(index)") 
} 

Risultati:

Midi properties: 0 
{ 
    "apple.midirtp.errors" = <>; 
    driver = "com.apple.AppleMIDIRTPDriver"; 
    entities =  (
    ); 
    image = "/Library/Audio/MIDI Drivers/AppleMIDIRTPDriver.plugin/Contents/Resources/RTPDriverIcon.tiff"; 
    manufacturer = ""; 
    model = ""; 
    name = Network; 
    offline = 0; 
    scheduleAheadMuSec = 50000; 
    uniqueID = 442847711; 
} 
+0

Ha funzionato come un incantesimo - grazie –

Problemi correlati