如何在 OS X 目标中创建 CFDictionary?

4
根据文档CFDictionaryCreate被用于Swift中实例化CFDictionary。
func CFDictionaryCreate(_ allocator: CFAllocator!,
                  _ keys: UnsafeMutablePointer<UnsafePointer<Void>>,
                  _ values: UnsafeMutablePointer<UnsafePointer<Void>>,
                  _ numValues: CFIndex,
                  _ keyCallBacks: UnsafePointer<CFDictionaryKeyCallBacks>,
                  _ valueCallBacks: UnsafePointer<CFDictionaryValueCallBacks>) -> CFDictionary!

我该如何创建 keysvalues 参数? 目前,我尝试使用Swift的 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不是keysvalues数组元素的正确类型:

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

我如何从 String 创建一个 UnsafePointer<Void>


6
最简单的方法是 let dict:CFDictionary = ["key1":"value1", "key2":"value2"] :) - rintaro
那个可以工作,谢谢 :) - PovilasB
2个回答

8
对于Swift 3,您需要进行额外的类型转换以使用CFDictionary。否则,会抛出“无法将上下文类型'CFDictionary'与字典文字一起使用”的错误。
let options: CFDictionary = [kSecImportExportPassphrase as String : "certificateKey"] as CFDictionary

更多信息请参见https://bugs.swift.org/browse/SR-2388


3

Printaro的评论适用于字符串字面量,但是当我使用CFStringRef和Swift String时不起作用:

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

我需要将CFStringRef强制转换为Swift String:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接