Ответ 1
Если вам не нужно иметь дело с другими функциями Core Foundation, ожидающими CFDictionary
, вы можете упростить это преобразование в Swift native Dictionary
:
if let dict = cfDict as? [String: AnyObject] {
print(dict["key"])
}
Мне нужно прочитать и записать некоторые данные из экземпляров CFDictionary
(чтобы читать и обновлять данные EXIF на фотографиях). Для жизни я не могу понять, как это сделать в Swift 3. Подпись для звонка, который я хочу, это:
func CFDictionaryGetValue(CFDictionary!, UnsafeRawPointer!)
Как я могу преобразовать свой ключ (строку) в UnsafeRawPointer
, чтобы передать его этому вызову?
Если вам не нужно иметь дело с другими функциями Core Foundation, ожидающими CFDictionary
, вы можете упростить это преобразование в Swift native Dictionary
:
if let dict = cfDict as? [String: AnyObject] {
print(dict["key"])
}
Будьте осторожны при преобразовании CFDictionary
в собственный словарь Swift. Мостовое соединение на самом деле довольно дорого, как я только что узнал в своем собственном коде (ура для профилирования!), Поэтому, если он вызывается довольно часто (как это было для меня), это может стать большой проблемой.
Помните, что CFDictionary
является бесплатным по NSDictionary
с 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
. Вы лучше преобразуете его в Swift Dictionary
, как это предлагается в Code Different answer.