Как создать буфер Pixel_8 в Swift
Я пытаюсь конвертировать код target-c в swift, и я полностью заблокирован, ища способ получить Pixel_8
буфер (который я обычно создаю, используя calloc
в цель-в) в быстром.
Вот пример в Objective-c... как он конвертируется в Swift?
Pixel_8 *buffer = (Pixel_8 *)calloc(width*height, sizeof(Pixel_8));
2 ответа
Решение
Ты можешь использовать calloc()
в Swift, но вы должны "привязать" необработанный указатель к требуемому типу:
let buffer = calloc(width * height, MemoryLayout<Pixel_8>.stride).assumingMemoryBound(to: Pixel_8.self)
// Use buffer ...
free(buffer)
В качестве альтернативы:
let buffer = UnsafeMutablePointer<Pixel_8>.allocate(capacity: width * height)
buffer.initialize(to: 0, count: width * height)
// Use buffer ...
buffer.deinitialize()
buffer.deallocate(capacity: width * height)
Но самым простым решением было бы выделить массив Swift:
var buffer = [Pixel_8](repeating: 0, count: width * height)
который управляется памятью автоматически. Вы можете пройти buffer
к любой функции, ожидающей UnsafePointer<Pixel_8>
или передать &buffer
к любой функции, ожидающей UnsafeMutablePointer<Pixel_8>
,
Пытаясь таким образом
декларация
typealias Pixel_8 = UInt8
swift3
var buffer: Pixel_8? = (calloc(width * height, MemoryLayout<Pixel_8>.size) as? Pixel_8)
swift2
var buffer = (calloc(width * height, sizeof(Pixel_8)) as! Pixel_8)