2010-03-10 28 views
10

Cocoa cung cấp NSDictionary, về cơ bản là một mảng kết hợp.Bản đồ hai chiều trong Cocoa

Có cách nào tốt để có được tính kết hợp hai chiều không? tức là một cách sẽ là nếu NSDictionary có phương thức keyForObject: phản ánh hành vi của objectForKey:.

Tôi không thực sự quan tâm nếu NSDictionary không phải là cách để có được điều này. Tôi biết NSDictionary không cung cấp keysOfEntriesPassingTest: nhưng nó trả về một số NSSet * không trông rất sạch sẽ đối với loại điều tôi muốn có.

Dưới đây là một ví dụ:

fieldMap = [[NSDictionary alloc] initWithObjectsAndKeys: 
    @"c0",@"synckey", 
    @"c1",@"wi_id", 
    @"c2",@"wi_parent_id", 
    @"c3",@"wi_type", 
    @"c4",@"wi_rh_task", 
    @"c5",@"decision_key", 
    @"c6",@"wi_stat", 
    @"c7",@"wi_prio", 
    @"c8",@"wi_cd", 
    @"c9",@"wi_ct", 
    @"cb",@"wi_dh_stat", 
    @"cc",@"wi_user", 
    nil]; 

Tôi muốn dịch giữa c0synckey và trở lại, và như trên cho các lĩnh vực khác.

Trả lời

10

Điều gần nhất cho những gì bạn đang theo dõi, tôi tin rằng allKeysForObject:. Điều này trả về một NSArray chứa các khóa tương ứng với tất cả các lần xuất hiện của một đối tượng đã cho trong từ điển. Rõ ràng nếu đối tượng nằm trong từ điển chỉ một lần, NSArray sẽ chỉ chứa một đối tượng.

Vì vậy, với ví dụ của bạn:

fieldMap = [[NSDictionary alloc] initWithObjectsAndKeys: 
    @"c0",@"synckey", 
    @"c1",@"wi_id", 
    @"c2",@"wi_parent_id", 
    @"c3",@"wi_type", 
    @"c4",@"wi_rh_task", 
    @"c5",@"decision_key", 
    @"c6",@"wi_stat", 
    @"c7",@"wi_prio", 
    @"c8",@"wi_cd", 
    @"c9",@"wi_ct", 
    @"cb",@"wi_dh_stat", 
    @"cc",@"wi_user", 
    nil]; 

mã bổ sung này sẽ trả về một mảng chứa 1 chuỗi đối tượng đánh giá để @ "c7":

NSArray *keyArray = [fieldMap allKeysForObject:@"wi_prio"]; 

[Ngoài: Lưu ý rằng điều này sẽ chỉ làm việc ở đây vì cách trình biên dịch hoạt động; nó có tất cả các lần xuất hiện của @ "wi_prio" và khiến chúng trở thành cùng một đối tượng. Nếu thay vào đó bạn có lẽ đã tải từ điển từ đĩa, cách tiếp cận này sẽ không hoạt động đối với NSStrings. Thay vào đó, bạn có thể sử dụng allKeys và sau đó lặp qua chúng, so sánh với [mystring isEqualToString:anotherString].]

Các vấn đề liên quan