如何枚举CFProperyList/CFDictionary键

Til*_*ill 10 macos enumeration core-foundation ios

我想迭代CFDictionary(CFPropertyList)并获取特定级别的所有值.

这将是我的字典/属性列表:


 root
 
  A
  
   foo
   0
   bar
   0
  
  B
  
   foo
   10
   bar
   100
  
  C
  
   foo
   20
   bar
   500
  
 
Run Code Online (Sandbox Code Playgroud)

使用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++时,如何实现这一目标?

ken*_*ytm 43

使用CFDictionaryApplyFunction通过字典来迭代.

static void printKeys (const void* key, const void* value, void* context) {
  CFShow(key);
}
...
CFDictionaryApplyFunction(dict, printKeys, NULL);
Run Code Online (Sandbox Code Playgroud)

  • 同意 解决各种问题的绝佳方法。 (2认同)

Rob*_*ier 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;
Run Code Online (Sandbox Code Playgroud)

你现在可以浏览指针了keys[].free(keys)当你完成时别忘了.

请记住,字典键不是字符串.他们是void*(这就是为什么他们把铸造的麻烦keysTypeRef进入keys).另请注意,我只在这里抓取了键,但您也可以同时获取值.有关更详细的示例,请参阅SeeMyFriends代码.


hew*_*ens 5

CFCopyDescription 在调试时很有帮助...

CFCopyDescription
Returns a textual description of a Core Foundation object.

    CFStringRef CFCopyDescription (
       CFTypeRef cf
    );
Run Code Online (Sandbox Code Playgroud)