Я ищу простейшие способы достижения разумной совместимости C в Swift, и мой текущий блок преобразует UnsafePointer<Int8>
(который был const char *
) в массив [Int8]
.Преобразование UnsafePointer с длиной в тип Swift Array
В настоящее время у меня есть наивный алгоритм, который может принимать UnsafePointer
и количество байт, и преобразует его в массив, элемент за элементом:
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])
}
}
Самой петля может быть ускорена с помощью arr.reserveCapacity(length)
, однако это не устраняет проблему самого цикла.
Я знаю this SO question, которая охватывает как конвертировать UnsafePointer<Int8>
в String
, однако String
это другое животное полностью [T]
. Есть ли удобный способ быстрого копирования байтов длины из UnsafePointer<T>
в [T]
? Я бы предпочел использовать чистые методы Swift, не проходя через NSData
или аналогичный. Если этот алгоритм действительно единственный способ сделать это, я с удовольствием придерживаюсь этого.
Приводит ли это утечка памяти? Я не могу найти никаких указаний на то, что 'UnsafeBufferPointer' освободит свою память. – Alexander
@AMomchilov:' UnsafeBufferPointer' - это просто указатель, он не выделяет память, поэтому нет ничего свободного. Затем «Массив» управляется Свифт. –
Да, но указатель, переданный в 'convert', должен быть освобожден, правильно? Это должно быть сделано явным, IMO – Alexander