我在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