Как создать буфер 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) 

Справочник по Apple API

Другие вопросы по тегам