2009-12-07 73 views
3

我知道你可以使用任何對象作爲NSDictionary的關鍵,但問題是它將能夠檢索正確的值?支持我有一個條目,其中鍵= {1,3,5}和值= {@「hello」}。我能通過傳入集合{3,5,1}從這個字典條目中檢索嗎?NSDictionary能否將NSSet作爲關鍵字?

爲了說話,是基於指針匹配的關鍵還是它實際上比較集合的內容? (如果是前者,我該如何克服這一點?)

回答

3

是的,它似乎很好地工作(不知道是否有任何陷阱)。

NSMutableDictionary * dict = [NSMutableDictionary dictionary]; 

NSSet * set; 
set = [NSSet setWithObjects:@"a", @"b", @"c", @"d", nil]; 
[dict setObject:@"1" forKey:set]; 

set = [NSSet setWithObjects:@"b", @"c", @"d", @"e", nil]; 
[dict setObject:@"2" forKey:set]; 

id key; 
NSEnumerator * enumerator = [dict keyEnumerator]; 
while ((key = [enumerator nextObject])) 
    NSLog(@"%@ : %@", key, [dict objectForKey:key]); 

set = [NSSet setWithObjects:@"c", @"b", @"e", @"d", nil]; 
NSString * value = [dict objectForKey:set]; 
NSLog(@"set: %@ : key: %@", set, value); 

輸出:

2009-12-08 15:42:17.885 x[4989] (d, e, b, c) : 2 
2009-12-08 15:42:17.887 x[4989] (d, a, b, c) : 1 
2009-12-08 15:42:17.887 x[4989] set: (d, e, b, c) : key: 2 
+3

一個簡單的疑難雜症;密鑰必須是不可變的,因此在密鑰上調用'copy'。所以任何'NSMutableSet'在用作鍵時都會被複制到一個新的'NSSet'中。 – PeyloW 2009-12-08 11:34:03

+0

鍵是不可變的,這就是爲什麼我使用NSSet。 – stefanB 2009-12-08 11:55:44

0

是的。

在IRB試試這個:

require 'osx/cocoa' 
abc=OSX::NSSet.setWithArray([1,2,3]) 
cba=OSX::NSSet.setWithArray([3,2,1]) 
dict=OSX::NSMutableDictionary.dictionary 
dict[abc] = 'hello' 
puts dict[cba] 

(它的工作原理,因爲isEqual:方法,當你希望它是和NSDictionary中立足於它的行動對NSSet中是如此)

6

的平等密鑰是在有問題的密鑰上使用isEqual完成的。因此,{1,3,5}和{3,5,1}的比較(假設數字由NSNUmber實例表示)將爲YES。

+4

這和'NSSet'符合'NSCopying',這是'NSDictionary'鍵的另一個要求。 – 2009-12-07 22:09:57

+1

+1:另外需要注意的是,如果您想使用鍵值編碼來訪問/變更它們,字典的鍵必須是字符串。 – 2009-12-08 00:24:42

1

是(因爲一套符合NSCopying並實現isEqual:),有一個陷阱:不要使用可變集合,或任何其他可變對象,作爲鍵。你改變它,於是你將打破你在字典中查找它的價值的能力。

相關問題