Как преобразовать массив в 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/

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