2010-02-17 4 views
8

Ich würde gerne ein CFDictionary (CFPropertyList) durchlaufen und alle Werte auf einer bestimmten Ebene erhalten.Wie man CFProperyList/CFDictionary Schlüssel aufzählt

Dies würde mein Wörterbuch/property-Liste sein:


root 
    
    A 
    
    foo 
    0 
    bar 
    0 
    
    B 
    
    foo 
    10 
    bar 
    100 
    
    C 
    
    foo 
    20 
    bar 
    500 
    
    

ObjC Mit ihm etwas würde wie folgt aussehen:

//dict is loaded with the dictionary below "root" 
NSDictionary *dict = [...]; 
NSEnumerator *enumerator = [dict keyEnumerator]; 
NSString *key; 
while (key = [enumerator nextObject]) 
{ 
    NSLog(key); 
}; 
 

Und es wäre wie eine Liste der Tasten auf der Konsole auszudrucken dies:

 
A 
B 
C 

Wie erreichen Sie dies, wenn C/C++ auf der CoreFoundation-Ebene?

Antwort

10

Basierend auf Code von 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; 

Sie können nun durch die Zeiger in keys[] gehen. Vergiss nicht free(keys) wenn du fertig bist.

Denken Sie daran, dass Wörterbuchschlüssel keine Zeichenfolgen sind. Sie sind void* (deshalb haben sie sich die Mühe gemacht, keysTypeRef in keys zu werfen). Beachten Sie auch, dass ich hier nur Schlüssel abgegriffen habe, aber Sie könnten auch Werte gleichzeitig erhalten. Ein detaillierteres Beispiel finden Sie im SeeMyFriends-Code.

+0

Dank einem Haufen - das ist die Arbeit geleistet haben. – Till

+0

Die CFDictionaryGetKeysAndValues-Methode verwendet einen Zeiger auf einen Zeiger auf ein Array der Schlüssel. Warum übergeben Sie dann nicht die Adresse des "keysTypeRef" -Zeigers (welcher ein Zeiger auf diesen Zeiger wäre)? – erikprice

+0

'CFDictionaryGetKeysAndValues' nimmt einen Zeiger auf ein Array von Zeigern (' void ** '), kein Zeiger auf einen Zeiger auf ein Array von Zeigern (' void *** '). Denken Sie daran, 'CFTypeRef' selbst ist ein Zeiger. –

41

Verwenden Sie CFDictionaryApplyFunction, um ein Wörterbuch zu durchlaufen.

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

Sehr elegant - danke! – Till

+1

Einverstanden. Ein ausgezeichneter Ansatz für eine Vielzahl von Problemen. –

4

CFCopyDescription ist hilfreich bei der Fehlersuche ...

CFCopyDescription 
Returns a textual description of a Core Foundation object. 

    CFStringRef CFCopyDescription (
     CFTypeRef cf 
    ); 
Verwandte Themen