如何在 OS X 目标中创建 CFDictionary?
Posted
技术标签:
【中文标题】如何在 OS X 目标中创建 CFDictionary?【英文标题】:How to create a CFDictionary in an OS X target? 【发布时间】:2015-03-27 12:59:54 【问题描述】:根据documentationCFDictionaryCreate
用于实例化swift
中的CFDictionary。
func CFDictionaryCreate(_ allocator: CFAllocator!,
_ keys: UnsafeMutablePointer<UnsafePointer<Void>>,
_ values: UnsafeMutablePointer<UnsafePointer<Void>>,
_ numValues: CFIndex,
_ keyCallBacks: UnsafePointer<CFDictionaryKeyCallBacks>,
_ valueCallBacks: UnsafePointer<CFDictionaryValueCallBacks>) -> CFDictionary!
如何创建 keys
和 values
参数?
到目前为止,我已经尝试使用 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
不是 keys
和 values
数组元素的正确类型:
main.swift:41:2: error: 'String' is not identical to 'UnsafePointer<Void>'
&configKeys, &configValues, 3, &keyCallbacks, &valueCallbacks)
如何从String
生成UnsafePointer<Void>
?
【问题讨论】:
最简单的方法是let dict:CFDictionary = ["key1":"value1", "key2":"value2"]
:)
确实有效,谢谢:)
【参考方案1】:
对于 Swift 3,您需要额外转换为 CFDictionary
。
否则上下文类型'CFDictionary'不能与字典一起使用抛出文字。
let options: CFDictionary = [kSecImportExportPassphrase as String : "certificateKey"] as CFDictionary
请参阅https://bugs.swift.org/browse/SR-2388 了解更多信息。
【讨论】:
【参考方案2】:rintaro 的评论适用于字符串文字,但当我使用 CFStringRef
和 Swift String
时却不行:
// Error: Contextual type 'CFDictionary' cannot be used with dictionary literal
let options: CFDictionary = [kSecImportExportPassphrase : "certificateKey"]
我必须将 CFStringRef 转换为 Swift 字符串:
let options: CFDictionary = [kSecImportExportPassphrase as String : "certificateKey"] // works
【讨论】:
以上是关于如何在 OS X 目标中创建 CFDictionary?的主要内容,如果未能解决你的问题,请参考以下文章
在 Mac OS X 中创建反应应用程序时出现 EACCESS 权限错误
在 Swing 中创建 Mac OS X 风格的 Dock Bar
在 Xcode 5.0.1 中创建 OS X Cocoa App Web 视图
在 OS X 10.9.4 中创建第一个 android 应用程序时出现 java.lang.NullPointerException