Как перечислить CFProperyList / ключи CFDictionary

Я хотел бы выполнить итерации через 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-уровне?

10
задан Till 4 March 2013 в 19:12
поделиться

2 ответа

На основе кода из 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.

11
ответ дан 3 December 2019 в 13:17
поделиться

Используйте CFDictionaryApplyFunction для перебора словаря.

static void printKeys (const void* key, const void* value, void* context) {
  CFShow(key);
}
...
CFDictionaryApplyFunction(dict, printKeys, NULL);
43
ответ дан 3 December 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: