如何在Swift 3中访问CFDictionary?

问题描述 投票:11回答:4

我需要从CFDictionary实例读取和写入一些数据(以读取和更新照片中的EXIF数据)。对于我的生活,我无法弄清楚如何在Swift 3中执行此操作。我想要的呼叫的签名是:

func CFDictionaryGetValue(CFDictionary!, UnsafeRawPointer!)

我怎么把我的键(一个字符串)转换成UnsafeRawPointer所以我可以把它传递给这个电话?

swift swift3 core-foundation
4个回答
13
投票

如果你不需要处理期望CFDictionary的其他Core Foundation函数,你可以通过转换为Swift本地Dictionary来简化它:

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

4
投票

小心地将CFDictionary转换为Swift本地词典。桥接实际上非常昂贵,因为我刚刚在我自己的代码中发现(yay for profiling!),所以如果它被调用了很多(就像我这样),这可能会成为一个大问题。

请记住,CFDictionary是免费的NSDictionary桥接。所以,你能做的最快的事情看起来更像是这样的:

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

1
投票

怎么样的:

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中检索一些数据时写这样的东西。您最好将其转换为Swift Dictionary,如Code Different的回答中所建议的那样。

© www.soinside.com 2019 - 2024. All rights reserved.