代码之家  ›  专栏  ›  技术社区  ›  Till

如何枚举cfpropertieslist/cfDictionary键

  •  10
  • Till  · 技术社区  · 15 年前

    我希望遍历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++在Copeoundation级别上实现这一点?

    3 回复  |  直到 12 年前
        1
  •  11
  •   Rob Napier    15 年前

    基于来自的代码 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
  •  42
  •   kennytm    15 年前

    使用 CFDictionaryApplyFunction 通过字典进行迭代。

    static void printKeys (const void* key, const void* value, void* context) {
      CFShow(key);
    }
    ...
    CFDictionaryApplyFunction(dict, printKeys, NULL);
    
        3
  •  4
  •   hewigovens    13 年前

    cfcopyDescription在调试时很有用…

    CFCopyDescription
    Returns a textual description of a Core Foundation object.
    
        CFStringRef CFCopyDescription (
           CFTypeRef cf
        );