Alocação e impressão Swift UnsafeMutablePointer <Não gerenciado <CFString>?>

Eu sou novo no Swift e tenho algumas dificuldades para lidar com indicadores de CFString não gerenciado (ou NSString). Estou trabalhando em um projeto CoreMIDI que implica o uso de UnsafeMutablePointer?> Como você pode ver nesta função:

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

Meu problema é que eu quero alocar um buffer para receber o conteúdo da propriedade (_str), chame a função acima e, finalmente, imprima o conteúdo no console usando println.

No momento em que escrevi isso:

// 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)

Não encontrei nenhum código de amostra para usar as funções CoreMIDI na biblioteca de desenvolvedores da Apple e não na Internet. Eu realmente confuso, porque eu venho do cpp e as coisas são muito diferentes no momento.

EDIT:

Após as respostas de Rintaro e Martin, ainda tenho um problema, todos os meus testes são feitos no iOS 8.1 e, se eu copiar o código que você trouxe para mim, o compilador diz que não posso escrever:

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

Os resultados em 'Não gerenciado' não podem ser convertidos em 'MIDIObjectRef'. Então eu adicionei um "&" porque MIDIObjectRef é um UnsafeMutablePointer <void>.

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

Agora: '<MIDIEndpoint> não gerenciado' não pode ser convertido em '@lvalue inout $ T2'. Finalmente tive que mudar o primeiro let para var, sem entender o porquê?!?

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

O código agora compila e executa, mas MIDIObjectGetStringProperty retorna OSStatus err -50, que corresponde a IOW ou a partir de MacErros.h:

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

Portanto, parece que os parâmetros não são os que o MIDIObjectGetStringProperty está esperando.

A fonte "0" existe no meu iPad porque MIDIGetNumberOfSources () retorna 1. Aqui está o código completo:

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))
        }
   }

Exibe:

MIDI Destinations : 1
error : -50

Eu realmente não entendo nada ...

ATUALIZAÇÃO:

Finalmente, Martin encontrou a solução, parece que existem duas definições diferentes de MIDIObjectRef nas arquiteturas de 32 e 64 bits. Ao executar o código em um iPad 2 antigo, meu código tentou compilar no modo de 32 bits em que o valor de retorno MIDIGetSource (i) não é convertível em MIDIObjectRef. A solução é "converter de forma insegura" o ponto de extremidade midi em arquiteturas de 32 bits:

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

... Ou para comprar um novo dispositivo de 64 bits ...

Obrigado pela preciosa ajuda

questionAnswers(1)

yourAnswerToTheQuestion