Как перечислить ключи CFProperyList / CFDictionary - PullRequest
10 голосов
/ 17 февраля 2010

Я хотел бы перебрать 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?

Ответы [ 3 ]

43 голосов
/ 17 февраля 2010

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

static void printKeys (const void* key, const void* value, void* context) {
  CFShow(key);
}
...
CFDictionaryApplyFunction(dict, printKeys, NULL);
11 голосов
/ 17 февраля 2010

На основе кода от 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;

Теперь вы можете пройтись по указателям в keys[]. Не забудьте free(keys) когда закончите.

Помните, что словарные ключи не являются строками. Они void* (именно поэтому они взяли на себя труд по превращению keysTypeRef в keys). Также обратите внимание, что я только взял ключи здесь, но вы также можете получить значения одновременно. См. Код SeeMyFriends для более подробного примера.

4 голосов
/ 30 марта 2012

CFCopyDescription полезно при отладке ...

CFCopyDescription
Returns a textual description of a Core Foundation object.

    CFStringRef CFCopyDescription (
       CFTypeRef cf
    );
...