如何枚举CFProperyList / CFDictionary键

时间:2010-02-17 18:46:44

标签: ios macos enumeration core-foundation

我想遍历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

在CoreFoundation级别使用C / C ++时,如何实现这一目标?

3 个答案:

答案 0 :(得分:42)

使用CFDictionaryApplyFunction迭代字典。

static void printKeys (const void* key, const void* value, void* context) {
  CFShow(key);
}
...
CFDictionaryApplyFunction(dict, printKeys, NULL);

答案 1 :(得分:11)

基于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代码。

答案 2 :(得分:4)

调试时CFCopyDescription很有用......

CFCopyDescription
Returns a textual description of a Core Foundation object.

    CFStringRef CFCopyDescription (
       CFTypeRef cf
    );