Я хотел бы выполнить итерации через CFDictionary (CFPropertyList) и получить все значения на определенном уровне.
Это было бы моим словарем / список свойств:
root
A
foo
0
bar
0
B
foo
10
bar
100
C
foo
20
bar
500
Используя ObjC это выглядело бы примерно так:
//dict is loaded with the dictionary below "root"
NSDictionary *dict = [...];
NSEnumerator *enumerator = [dict keyEnumerator];
NSString *key;
while (key = [enumerator nextObject])
{
NSLog(key);
};
И это распечатало бы список ключей к консоли как это:
A B C
Как Вы достигаете этого при использовании C/C++ на CoreFoundation-уровне?
На основе кода из SeeMyFriends :
CFDictionaryRef dict = CFDictionaryCreate(...)
size size = CFDictionaryGetCount(dict);
CFTypeRef *keysTypeRef = (CFTypeRef *) malloc( size * sizeof(CFTypeRef) );
CFDictionaryGetKeysAndValues(dict, (const void **) keysTypeRef, NULL);
const void **keys = (const void **) keysTypeRef;
Теперь вы можете перемещаться по указателям в ключах []
. Не забудьте бесплатно (ключи)
, когда закончите.
Помните, что ключи словаря не являются строками. Это void *
(поэтому они взяли на себя труд преобразовать keysTypeRef
в ключи
). Также обратите внимание, что я взял здесь только ключи, но вы также можете получить значения одновременно. См. Более подробный пример в коде SeeMyFriends.
Используйте CFDictionaryApplyFunction
для перебора словаря.
static void printKeys (const void* key, const void* value, void* context) {
CFShow(key);
}
...
CFDictionaryApplyFunction(dict, printKeys, NULL);