如何在Swift 3中访问CFDictionary?

17

我需要从CFDictionary实例中读取和写入一些数据(用于读取和更新照片的EXIF数据)。无论如何,我都无法弄清楚如何在Swift 3中完成此操作。我想要调用的函数签名是:

func CFDictionaryGetValue(CFDictionary!, UnsafeRawPointer!)

我该怎么把我的密钥(一个字符串)转换成一个UnsafeRawPointer,以便我可以将它传递给这个调用?

4个回答

23
如果您不必处理其他期望CFDictionary的Core Foundation函数,可以通过转换为Swift本地Dictionary来简化它:
if let dict = cfDict as? [String: AnyObject] {
    print(dict["key"])
}

@LeoDabus,Swift将NSDictionary导入为[AnyHashable: Any],但这并不意味着NSDictionary不能转换为[String: AnyObject] - OOPer
3
请注意性能问题 - 将CFDictionary转换为Swift Dictionary是一个昂贵的操作。请参见我的下面的答案:https://dev59.com/BVkS5IYBdhLWcg3ws4nr#45625787 - Gabriel

11

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
}

在Swift 5.9的2023年,桥接实际上是相当昂贵的吗? - undefined

2

那么,类似这样的内容呢:

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

-1
你可以写出类似这样的代码:
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接