2017-01-01 2 views
0

Я пытаюсь преобразовать код Swift 2 в последний синтаксис (Swift 3). Я получаю следующее сообщение об ошибке:Swift conversion: ERROR - UnsafeMutablePointer

Cannot invoke initializer for type 'UnsafeMutablePointer<CUnsignedChar>' with an argument list of type '(UnsafeMutableRawPointer!)

Swift 2 Код:

let rawData = UnsafeMutablePointer<CUnsignedChar>(calloc(height * width * 4, Int(sizeof(CUnsignedChar)))) 

Может кто-то пожалуйста, помогите мне решить эту проблему преобразования синтаксиса?

ответ

1

calloc возвращает «необработанный указатель» (эквивалент Swift void * в C). Вы можете преобразовать его в типизированного указателя с assumingMemoryBound:

let rawData = calloc(width * height, MemoryLayout<CUnsignedChar>.stride).assumingMemoryBound(to: CUnsignedChar.self) 

В качестве альтернативы использовать allocate() метод UnsafeMutablePointer:

let rawData = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: width * height) 
rawData.initialize(to: 0, count: width * height) 
// ... 

rawData.deinitialize() 
rawData.deallocate(capacity: width * height)