2016-10-10 2 views
5

Здесь был мой выполнимый код в предыдущей версии Swift:Как преобразовать массив в UnsafeMutablePointer <UnsafeRawPointer?> Swift 3.0?

let imageOptionsDictKeys = [ kCVPixelBufferPixelFormatTypeKey, kCVPixelBufferWidthKey, kCVPixelBufferHeightKey, kCVPixelBufferOpenGLESCompatibilityKey, kCVPixelBufferIOSurfacePropertiesKey] 
let imageOptionsDictValues = [ cvPixelFormatType, frameW, frameH, boolYES] 

var keyCallbacks = kCFTypeDictionaryKeyCallBacks 
var valueCallbacks = kCFTypeDictionaryValueCallBacks 

let imageOptions = CFDictionaryCreate(kCFAllocatorDefault, UnsafeMutablePointer(imageOptionsDictKeys), UnsafeMutablePointer(imageOptionsDictValues), 4, &keyCallbacks, &valueCallbacks) 

После изменений в Swift 3.0 я должен преобразовать ключи и значения массива в UnsafeMutablePointer<UnsafeRawPointer?> для создания CFDictionary.

Таким образом:

let imageOptionsDictKeysPointer = UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: 1) 
    imageOptionsDictKeysPointer.initialize(to: imageOptionsDictKeys) 

дает Bad ошибку доступа.

И после прочтения документации я пытаюсь скомпилировать этот код:

 let imageOptionsDictKeys = [kCVPixelBufferPixelFormatTypeKey, kCVPixelBufferWidthKey, kCVPixelBufferHeightKey, kCVPixelBufferOpenGLESCompatibilityKey] 
     let imageOptionsDictKeysRawPointer = Unmanaged.passUnretained(imageOptionsDictKeys).toOpaque() 
     let imageOptionsDictKeysPointer = UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: 1) 
     imageOptionsDictKeysPointer.initialize(to: imageOptionsDictKeysRawPointer) 

     let imageOptionsDictValues = [ cvPixelFormatType, frameW, frameH, boolYES] 
     let imageOptionsDictValuesRawPointer = Unmanaged.passUnretained(imageOptionsDictValues).toOpaque() 
     let imageOptionsDictValuesPointer = UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: 1) 
     imageOptionsDictValuesPointer.initialize(to: imageOptionsDictValuesRawPointer) 

     let imageOptions = CFDictionaryCreate(kCFAllocatorDefault, imageOptionsDictKeysPointer, imageOptionsDictValuesPointer, 4, &keyCallbacks, &valueCallbacks) 

но ошибка Generic параметр «Instance» не может быть выведено появляется в строках Unmanaged.passUnretained (массив). toOpaque()

Я понятия не имею, как создать CFDictionary программно сейчас.

+0

Не создать CFDictionary. Вместо этого создайте Swift Dictionary, например, здесь: http://stackoverflow.com/a/38171414/1187415. –

+0

Мне нужно вызвать функцию VTCompressionSessionCreate (....) с параметрами CFDictionary. Я не уверен, что могу использовать только Swift Dictionary ... или они каким-то образом конвертируемы? – JULIIncognito

+0

Похоже на излишне сложный способ создания «CFDictionary» и учебника [XY Problem] (http://xyproblem.info). См. Http://stackoverflow.com/q/29301302/3141234 – Alexander

ответ

0

Я просто решил аналогичную проблему преобразования массивов UnsafeMutablePointer< UnsafeMutablePointer<T>>, которые вы можете найти здесь: Swift 3 UnsafeMutablePointer initialization for C type float**

Для преобразования быстрых массивов, используя ту же схему, использовать UnsafeMuTablePointer как предложено здесь: http://technology.meronapps.com/2016/09/27/swift-3-0-unsafe-world-2/