Sto cercando i modi più semplici per ottenere un'interoperabilità C ragionevole in Swift e il mio blocco corrente sta convertendo un UnsafePointer<Int8>
(che era un const char *
) in un array [Int8]
.Conversione di un UnsafePointer di lunghezza con un tipo di array Swift
Attualmente, ho un algoritmo banale che può assumere un UnsafePointer
e un numero di byte e lo converte in un array, elemento per elemento:
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])
}
}
L'anello stesso può essere accelerato mediante arr.reserveCapacity(length)
, tuttavia ciò non rimuove il problema del loop stesso.
Sono consapevole di this SO question che copre come convertire UnsafePointer<Int8>
-String
, tuttavia String
è una bestia diversa interamente alla [T]
. Esiste un modo rapido per copiare i byte di lunghezza da uno UnsafePointer<T>
in un [T]
? Preferirei i metodi puri di Swift, senza passare attraverso NSData
o simili. Se l'algoritmo di cui sopra è davvero l'unico modo per farlo, sono felice di attenervelo.
Questo causa una perdita di memoria? Non riesco a trovare alcuna indicazione che 'UnsafeBufferPointer' libererà la sua memoria – Alexander
@AMomchilov:' UnsafeBufferPointer' è solo un puntatore, non alloca memoria, quindi non c'è nulla da liberare. "Array" è quindi gestito da Swift. –
Sì, ma il puntatore passato in 'convert' deve essere liberato, giusto? Questo dovrebbe essere reso esplicito, IMO – Alexander