web-dev-qa-db-ja.com

Swift 3でCFDictionaryにアクセスする方法は?

CFDictionaryインスタンスからいくつかのデータを読み書きする必要があります(写真のEXIFデータを読み書きするため)。私の人生では、Swift 3。でこれを行う方法を理解できません。必要な呼び出しの署名は次のとおりです。

func CFDictionaryGetValue(CFDictionary!, UnsafeRawPointer!)

キー(文字列)をUnsafeRawPointerに変換して、この呼び出しに渡すにはどうすればよいですか?

12
Trevor Alyn

CFDictionaryを期待する他のCoreFoundation関数を処理する必要がない場合は、SwiftネイティブDictionary:に変換することで単純化できます。

if let dict = cfDict as? [String: AnyObject] {
    print(dict["key"])
}
14
Code Different

CFDictionaryをSwiftネイティブ辞書に変換する場合は注意が必要です。自分のコードで見つけたので、ブリッジングは実際にはかなり高価です(プロファイリングに賛成です!)。 (私にとってはそうだったように)かなり多く呼ばれているので、これは大きな問題になる可能性があります。

CFDictionaryフリーダイヤルブリッジNSDictionaryであることに注意してください。したがって、実行できる最速のことは次のようになります。

let cfDictionary: CFDictionary = <code that returns CFDictionary>
if let someValue = (cfDictionary as NSDictionary)["some key"] as? TargetType {
    // do stuff with someValue
}
5
Gabriel

次のようなものはどうですか?

var key = "myKey"
let value = withUnsafePointer(to: &key){ upKey in
    return CFDictionaryGetValue(myCFDictionary, upKey)
}
1
Jans