我在Objective-C中訪問可變字典鍵和值時遇到了一些困難。目標c中的每個循環訪問NSMutable字典
假設我有這樣的:
NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
我可以設置鍵和值。現在,我只想訪問每個鍵和值,但我不知道設置的鍵的數量。
在PHP這是很容易的東西如下:
foreach ($xyz as $key => $value)
怎麼可能在Objective-C?
我在Objective-C中訪問可變字典鍵和值時遇到了一些困難。目標c中的每個循環訪問NSMutable字典
假設我有這樣的:
NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];
我可以設置鍵和值。現在,我只想訪問每個鍵和值,但我不知道設置的鍵的數量。
在PHP這是很容易的東西如下:
foreach ($xyz as $key => $value)
怎麼可能在Objective-C?
for (NSString* key in xyz) {
id value = [xyz objectForKey:key];
// do stuff
}
這適用於每一個符合NSFastEnumeration協議(1050 +上和iOS提供)類,雖然NSDictionary
是少數藏品,它可以讓你列舉鍵而不是值之一。我建議你閱讀Collections Programming Topic中的fast enumeration。
哦,我應該補充說,你應該從不修改集合,而枚舉通過它。
我建議您閱讀Collections Programming Guide for Cocoa的Enumeration: Traversing a Collection’s Elements部分。有你的需要的示例代碼。
這些都是很好的鏈接,儘管發佈的代碼更加簡單快捷,如果您可以構建10.5+或iPhone。 – 2010-01-26 23:41:53
您可以使用-[NSDictionary allKeys]
訪問所有密鑰並在其中循環。
確實如此,但這確實會創建一個額外的自動釋放數組,這可能非常浪費,特別是對於有很多密鑰的字典。 – 2010-01-27 06:11:17
在10.5和iPhone OS中添加了快速枚舉,它顯着更快,不僅僅是語法糖。如果你有目標較舊的運行時(即10.4和向後),你將不得不使用枚舉的老方法:
NSDictionary *myDict = ... some keys and values ...
NSEnumerator *keyEnum = [myDict keyEnumerator];
id key;
while ((key = [keyEnum nextObject]))
{
id value = [myDict objectForKey:key];
... do work with "value" ...
}
你不鬆開枚舉對象,你不能復位。如果你想重新開始,你必須從字典中尋求一個新的枚舉器對象。
只是爲了不漏掉使用塊枚舉鍵和值
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
NSLog(@"%@ = %@", key, object);
}];
如果你想在行動同時發生的10.6+選項...:
[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(id key, id object, BOOL *stop) {
NSLog(@"%@ = %@", key, object);
}];
3種不同的通過字典枚舉的方法。 。 。嘿,這讓我想起了「奇異語言特徵」的答案,其中VB有7種不同類型的循環。 – dreamlax 2010-01-27 05:47:29
那麼...... objectEnumerator在1994年被添加了,在2006年被添加了(...在...),並且在2009年被添加了塊。枚舉的塊形式是自然後果。 – bbum 2010-02-08 04:25:14
這似乎比標準* for ... in *構造更快:http://oneofthesedaysblog.com/block-vs-for-in-objective-c-enumeration – lkraider 2011-07-08 20:40:47
如果您需要變異字典,同時列舉:
for (NSString* key in xyz.allKeys) {
[xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}
原因是'allKeys'返回密鑰副本。所以變更字典是安全的。 – 2018-03-10 04:05:50
枚舉字典的最簡單方法是
for (NSString *key in tDictionary.keyEnumerator)
{
//do something here;
}
其中tDictionary
是要遍歷NSDictionary
或NSMutableDictionary
。
我想知道,不應該是:for(NSString * key in [xyz allKeys])??或者它並不重要。 – 2012-04-02 04:23:24
@ user76859403枚舉字典實際上是枚舉鍵。'for(NSString * key in [xyz allKeys])'概念上是一樣的。 – zneak 2012-04-02 05:09:27
使用[xyz allKeys]如果您需要在枚舉鍵時對詞典進行變異。請參閱下面的答案。 – 2013-06-03 20:05:46