Как преобразовать массив в UnsafeMutablePointer<UnsafeRawPointer?> Swift 3.0?
Вот мой рабочий код в предыдущей версии Swift:
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 Access.
И после прочтения документации я пытаюсь скомпилировать этот код:
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)
но ошибка Общий параметр 'Instance' не может быть выведен, появляется в строках Unmanaged.passUnretained (array).toOpaque ()
Я понятия не имею, как создать CFDictionary программно сейчас.
1 ответ
Я только что решил аналогичную проблему преобразования массивов в UnsafeMutablePointer< UnsafeMutablePointer<T>>
который вы можете найти здесь: Swift 3 UnsafeMutablePointer initialization для типа C float**
Для преобразования быстрых массивов по той же схеме используйте UnsafeMuTablePointer
как предложено здесь: http://technology.meronapps.com/2016/09/27/swift-3-0-unsafe-world-2/