我需要从CFDictionary
实例中读取和写入一些数据(用于读取和更新照片的EXIF数据)。无论如何,我都无法弄清楚如何在Swift 3中完成此操作。我想要调用的函数签名是:
func CFDictionaryGetValue(CFDictionary!, UnsafeRawPointer!)
我该怎么把我的密钥(一个字符串)转换成一个UnsafeRawPointer
,以便我可以将它传递给这个调用?
我需要从CFDictionary
实例中读取和写入一些数据(用于读取和更新照片的EXIF数据)。无论如何,我都无法弄清楚如何在Swift 3中完成此操作。我想要调用的函数签名是:
func CFDictionaryGetValue(CFDictionary!, UnsafeRawPointer!)
我该怎么把我的密钥(一个字符串)转换成一个UnsafeRawPointer
,以便我可以将它传递给这个调用?
CFDictionary
的Core Foundation函数,可以通过转换为Swift本地Dictionary
来简化它:if let dict = cfDict as? [String: AnyObject] {
print(dict["key"])
}
将 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
}
那么,类似这样的内容呢:
var key = "myKey"
let value = withUnsafePointer(to: &key){ upKey in
return CFDictionaryGetValue(myCFDictionary, upKey)
}
let key = "some key" as NSString
if let rawResult = CFDictionaryGetValue(cfDictionary, Unmanaged.passUnretained(key).toOpaque()) {
let result = Unmanaged<AnyObject>.fromOpaque(rawResult).takeUnretainedValue()
print(result)
}
但我猜你不想每次从那个CFDictionary
检索数据时都写这样的东西。最好按照Code Different的答案建议将其转换为Swift Dictionary
。
NSDictionary
导入为[AnyHashable: Any]
,但这并不意味着NSDictionary
不能转换为[String: AnyObject]
。 - OOPer