4

ドキュメント によると、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引数を作成するにはどうすればよいですか? これまでのところString、適切な型に自動的に変換されることを期待して、swift の型を使用しようとしました。

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)

UnsafePointer<Void>fromを作成するにはどうすればよいStringですか?

4

2 に答える 2

6

Swift 3 の場合、 への追加のキャストが必要ですCFDictionary。それ以外の場合、コンテキスト タイプ 'CFDictionary' をディクショナリリテラルと共に使用することはできませんがスローされます。

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

詳細については、 https://bugs.swift.org/browse/SR-2388を参照してください。

于 2016-10-08T12:35:09.207 に答える
3

rintaro のコメントは文字列リテラルでは機能しましたが、 aCFStringRefと 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
于 2016-08-23T14:17:34.233 に答える