2010-02-17 30 views
8

Tôi muốn lặp qua CFDictionary (CFPropertyList) và nhận tất cả các giá trị ở một mức cụ thể.Cách liệt kê các phím CFProperyList/CFDictionary

Đây sẽ là từ điển của tôi/bất động sản-list:


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

Sử dụng ObjC nó sẽ giống như thế này:

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

Và nó sẽ in ra một danh sách các phím ra cửa sổ Console như này:

 
A 
B 
C 

Làm thế nào để bạn đạt được điều này khi sử dụng C/C++ ở cấp độ CoreFoundation?

Trả lời

10

Dựa trên mã từ 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; 

Bây giờ bạn có thể đi bộ qua các con trỏ trong keys[]. Đừng quên free(keys) khi bạn hoàn tất.

Hãy nhớ rằng các phím từ điển không phải là chuỗi. Họ là void* (đó là lý do tại sao họ đã gặp rắc rối khi đúc keysTypeRef vào keys). Cũng lưu ý rằng tôi đã chỉ nắm lấy chìa khóa ở đây, nhưng bạn cũng có thể nhận được các giá trị cùng một lúc. Xem mã SeeMyFriends cho một ví dụ chi tiết hơn.

+0

Cảm ơn bó - đó đã làm các công việc. – Till

+0

Phương thức CFDictionaryGetKeysAndValues ​​lấy một con trỏ tới một con trỏ tới một mảng các khóa. Tại sao, sau đó, bạn không vượt qua địa chỉ của "keysTypeRef" con trỏ (mà sẽ là một con trỏ đến con trỏ đó)? – erikprice

+0

'CFDictionaryGetKeysAndValues' lấy một con trỏ tới một mảng con trỏ (' void ** '), không phải là một con trỏ tới một con trỏ tới một mảng con trỏ (' void *** '). Hãy nhớ rằng, 'CFTypeRef' chính nó là một con trỏ. –

41

Sử dụng CFDictionaryApplyFunction để lặp qua từ điển.

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

Rất thanh lịch - cảm ơn! – Till

+1

Đồng ý. Một cách tiếp cận tuyệt vời cho nhiều vấn đề khác nhau. –

4

CFCopyDescription là hữu ích khi Gỡ rối ...

CFCopyDescription 
Returns a textual description of a Core Foundation object. 

    CFStringRef CFCopyDescription (
     CFTypeRef cf 
    ); 
Các vấn đề liên quan