【问题标题】:How to create a CFDictionary in an OS X target?如何在 OS X 目标中创建 CFDictionary?
【发布时间】: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!

如何创建 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&lt;Void&gt;

【问题讨论】:

  • 最简单的方法是let dict:CFDictionary = ["key1":"value1", "key2":"value2"] :)
  • 确实有效,谢谢:)

标签: swift macos core-foundation cfstring cfdictionary


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2015-01-15
      相关资源
      最近更新 更多