Ich bin auf der Suche nach den einfachsten Möglichkeiten, um eine vernünftige C-Interoperabilität in Swift zu erreichen, und mein aktueller Block konvertiert ein UnsafePointer<Int8>
(das war ein const char *
) in ein [Int8]
Array.Umwandlung eines UnsafePointer mit Länge in einen Swift Array Typ
Derzeit Ich habe einen naiven Algorithmus, der eine UnsafePointer
und eine Anzahl von Bytes nehmen und wandelt es in ein Array, Element für Element:
func convert(length: Int, data: UnsafePointer<Int8>) {
let buffer = UnsafeBufferPointer(start: data, count: length);
var arr: [Int8] = [Int8]()
for (var i = 0; i < length; i++) {
arr.append(buffer[i])
}
}
Die Schleife selbst durch Verwendung arr.reserveCapacity(length)
beschleunigt werden kann, Das beseitigt jedoch nicht das Problem der Schleife selbst.
Ich bin mir dessen bewusst this SO question, die beschreibt, wie UnsafePointer<Int8>
-String
zu konvertieren, aber String
ist ein anderes Tier ganz [T]
. Gibt es einen praktischen schnellen Weg, um Längenbytes von einem UnsafePointer<T>
in einen [T]
zu kopieren? Ich würde reine Swift-Methoden bevorzugen, ohne NSData
oder ähnliches zu durchlaufen. Wenn der obige Algorithmus wirklich der einzige Weg ist, dies zu tun, bin ich glücklich, dabei zu bleiben.
Verursacht dies ein Speicherleck? Ich kann keinen Hinweis darauf finden, dass 'UnsafeBufferPointer' seinen Speicher freigibt – Alexander
@AMomchilov:' UnsafeBufferPointer' ist nur ein Zeiger, er reserviert keinen Speicher, also gibt es nichts zu befreien. Das 'Array' wird dann von Swift verwaltet. –
Ja, aber der Zeiger, der in 'convert' übergeben wurde, muss freigegeben werden, oder? Das sollte explizit gemacht werden, IMO – Alexander