2017-12-28 15 views
0

Wie kann ich UnsafeMutablePointer<T?> als UnsafeMutablePointer<UnsafeRawPointer?>!Swift Ordnen Array von Zeigern

zum Beispiel verwenden Der Versuch, n Speicherblöcke für Typ T, um Werte aus einer CFSet cfsetref zuteilen:

var array = UnsafeMutableRawPointer<T?>.allocate(capacity: n) 
CFSetGetValues(cfsetref, array) // error 

Welche gibt den Fehler

Kann nicht konvertieren Wert vom Typ ‚UnsafeMutablePointer<T?>‘ zu erwarten Argument Typ "UnsafeMutablePointer<UnsafeRawPointer?>! '

ich versuchte zu erklären array als UnsafeMutablePointer<UnsafeRawPointer?> dann

tun

Aber ich bekomme immer noch EXC_BAD_INSTRUCTION Fehler beim Zugriff versucht array[i] (nach den Speicher wieder zu T Bindung)

Antwort

1

Vieles hängt davon ab, wie Sie Ihre cfsetref bekommen und was ist eigentlich T.

Aber trotzdem CFSetGetValues erwartet UnsafeMutablePointer<UnsafeRawPointer?>! wie in der Fehlermeldung angezeigt.

let n = CFSetGetCount(cfsetref) 
let array = UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: n) 
array.initialize(to: nil, count: n) 
CFSetGetValues(cfsetref, array) 

sicher Um den Inhalt array zuzugreifen, müssen Sie wissen, wie T von Swift ARC verwaltet wird. Wenn zum Beispiel angenommen T ist NSNumber, das Ergebnis Swift ARC zu verwalten mit dem Schreiben, so etwas zu sagen brauchen:

let managedArray = UnsafeMutableBufferPointer(start: array, count: n).map{Unmanaged<NSNumber>.fromOpaque($0!).takeRetainedValue()} 
print(managedArray) 

Aber wie auch andere CF-Collection-Typen, der bessere Weg CFSet zu handhaben Set ist es zu Swift Überbrückung:

if let swiftSet = cfsetref as? Set<NSNumber> { 
    let swiftArray = Array(swiftSet) 
    print(swiftArray) 
} 

Wie bekommen Sie Ihre cfsetref und welche tatsächlichen ly ist T? Mit solchen Informationen würde ich versuchen, Ihnen zu sagen, welche Art von Code Sie in Ihrem tatsächlichen Fall schreiben müssen.

+0

Überbrückung zu 'Set' fühlt sich richtig an. Mein 'CFSet' kommt von' IOHIDManagerCopyDevices', wobei 'T' ein' IOHIDDevice' ist. Ich habe es nicht geschafft, meine eigenen Zeiger/Speicher zu verwalten, aber die Überbrückung zu 'Set' scheint aus der Box zu funktionieren (und ist so viel einfacher). Vielen Dank. – comfortablejohn