Как создать CFDictionary в цели OS X?

Согласно документации CFDictionaryCreate используется для создания экземпляра CFDictionary в swift,

func CFDictionaryCreate(_ allocator: CFAllocator!,
                  _ keys: UnsafeMutablePointer<UnsafePointer<Void>>,
                  _ values: UnsafeMutablePointer<UnsafePointer<Void>>,
                  _ numValues: CFIndex,
                  _ keyCallBacks: UnsafePointer<CFDictionaryKeyCallBacks>,
                  _ valueCallBacks: UnsafePointer<CFDictionaryValueCallBacks>) -> CFDictionary!

Как я могу создать keys а также values аргументы? До сих пор я пытался использовать Swift's String Тип надеется, что он будет автоматически преобразован в соответствующие типы:

import Foundation

var keys : [String] = ["key1", "key2"]
var values : [String] = ["value1", "value2"]
var keyCallbacks = kCFTypeDictionaryKeyCallBacks
var valueCallbacks = kCFTypeDictionaryValueCallBacks
var dict : CFDictionary = CFDictionaryCreate(kCFAllocatorDefault,
    &keys, &values, 2, &keyCallbacks, &valueCallbacks)

К сожалению, я получаю сообщение об ошибке String не подходит для keys а также values элементы массива:

main.swift:41:2: error: 'String' is not identical to 'UnsafePointer<Void>'
    &configKeys, &configValues, 3, &keyCallbacks, &valueCallbacks)

Как мне сделать UnsafePointer<Void> от String?

2 ответа

Для Swift 3 вам нужно дополнительное наведение на CFDictionary, В противном случае контекстный тип 'CFDictionary' не может быть использован с литералом словаря.

let options: CFDictionary = [kSecImportExportPassphrase as String : "certificateKey"] as CFDictionary

См. https://bugs.swift.org/browse/SR-2388 для получения дополнительной информации.

Комментарий Ринтаро работал для строковых литералов, но не тогда, когда я работал с CFStringRef и Свифт String:

// Error: Contextual type 'CFDictionary' cannot be used with dictionary literal
let options: CFDictionary = [kSecImportExportPassphrase : "certificateKey"]

Я должен был привести CFStringRef в качестве быстрой строки:

let options: CFDictionary = [kSecImportExportPassphrase as String : "certificateKey"] // works
Другие вопросы по тегам