如何在 Swift 3 中访问 CFDictionary?
How to access CFDictionary in Swift 3?
我需要从 CFDictionary
个实例读取和写入一些数据(以读取和更新照片中的 EXIF 数据)。对于我的生活,我不知道如何在 Swift 中执行此操作 3. 我想要的调用签名是:
func CFDictionaryGetValue(CFDictionary!, UnsafeRawPointer!)
如何将我的密钥(字符串)转换为 UnsafeRawPointer
以便我可以将其传递给此调用?
怎么样:
var key = "myKey"
let value = withUnsafePointer(to: &key){ upKey in
return CFDictionaryGetValue(myCFDictionary, upKey)
}
如果您不必处理其他需要 CFDictionary
的 Core Foundation 函数,您可以通过转换为 Swift 原生 Dictionary
:
来简化它
if let dict = cfDict as? [String: AnyObject] {
print(dict["key"])
}
你可以这样写:
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
。
将 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
}
我需要从 CFDictionary
个实例读取和写入一些数据(以读取和更新照片中的 EXIF 数据)。对于我的生活,我不知道如何在 Swift 中执行此操作 3. 我想要的调用签名是:
func CFDictionaryGetValue(CFDictionary!, UnsafeRawPointer!)
如何将我的密钥(字符串)转换为 UnsafeRawPointer
以便我可以将其传递给此调用?
怎么样:
var key = "myKey"
let value = withUnsafePointer(to: &key){ upKey in
return CFDictionaryGetValue(myCFDictionary, upKey)
}
如果您不必处理其他需要 CFDictionary
的 Core Foundation 函数,您可以通过转换为 Swift 原生 Dictionary
:
if let dict = cfDict as? [String: AnyObject] {
print(dict["key"])
}
你可以这样写:
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
。
将 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
}