2012-08-09 36 views
1

我對Objective-C非常陌生,遇到了NSDictionary方法allKeysForObject:。看起來非常有用。但是,我有一個NSDictionary有幾個NSArrays(所有長度爲2),並由NSStrings鍵入。基本上,鍵是項目和陣列定義它們的兩個屬性。如果我想拉取所有具有特定屬性的項目名稱,是否可以使用類似allKeysForObject的東西來完成,或者我應該循環遍歷字典並生成可變數組(似乎效率低下)。ObjC:NSDictionary allKeysForObject *包含*(這是可能的嗎?)

我會加入一段代碼,但我覺得這個問題足夠概念化,代碼不會真正澄清任何事情。哦,到底什麼。這裏有一些簡化的代碼:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:2],nil],@"Car",[NSArray arrayWithObjects:[NSNumber numberWithInt:2],[NSNumber numberWithInt:3],nil],@"Boat",nil]; 
NSLog(@"%@",[dict allKeysForObject:???]); // this is the line I am not at all sure about. 

編輯:謝謝你的迴應到目前爲止。雖然我不清楚我的問題。我正在尋找一種更通用的方法。我不想檢索特定對象的所有密鑰,例如[1,2],但我想查看字典中的所有數組,包括NSNumber 1並返回這些密鑰。所以如果我添加@"Plane",[NSArray arrayWithObjects:[NSNumber numberWithInt:1],[NSNumber numberWithInt:3],nil],我想以某種方式查詢NSNumber 1並獲得@"Car"@"Plane"。我意識到這不是這種方法設計的目的。

回答

5

您正在尋找-keysOfEntriesPassingTest: ...

NSArray * selectedKeys = [dict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) 
          { 
           return [obj containsObject:[NSNumber numberWithInt:2]]; 
          }]; 
+0

啊哈!這看起來不錯!謝謝,我需要玩它,但謝謝你指點我正確的軌道! – 2012-08-09 18:35:51

-2

在您的例子,如果你調用

[dict allKeysForObject: [NSArray arrayWithObjects: 
          [NSNumber numberWithInt:2], 
          [NSNumber numberWithInt:3], 
          nil]]] 

你應該得到一個僅包含一個數組@ 「船」

+0

謝謝,我明白這是如何工作的。它也可能只匹配其中一個元素嗎?基本上,我想匹配包含NSNumber 2的一類對象,例如。理想情況下,這種匹配將獨立於位置,因此它將與陣列中的任何位置的NSNumber 2匹配。 – 2012-08-09 18:29:17

+1

編號。allKeysForObject應該返回映射到同一對象的所有關鍵字(在isEqual意義上,而不是具有相同地址)。如果你想做你說的話,你需要存儲一些不同於NSArray的東西。根據需要創建自己的類並定義isEqual。或者使用keysOfEntriesPassingTest:或keysOfEntriesWithOptions:passingTest: – 2012-08-09 18:36:13

+0

好的,謝謝,這是有道理的。我試圖理解'keysOfEnablingPassingTest',但這意味着理解塊,這只是另一個複雜的層次。我對你對重新定義isEqual所說的話感興趣。你是說如果我將屬性不是作爲數組存儲,而是創建了一個「item」類,我可以用包含我當前擁有的數組的項目對象填充字典,並使用isEqual來做我想要做的比較?正如你所說,我想要的不是真正的「平等」情況。我只想用某個屬性拉項目名稱。 – 2012-08-09 18:51:27