1

我试图在 for 循环中使用多个值。如果我创建两个单独的 for 循环,代码会重复两次,所以我尝试了这个:

for ((NSString* Key in [Dictionary allKeys]) && (NSString* Key2 in [Dictionary allValues])){

但是没办法!!我该怎么做??

4

5 回答 5

3

NSDictionary为此提供了一种特殊的基于块的方法:

[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    // do something with key and obj
}];
于 2012-05-12T12:42:01.960 回答
1

首先,变量名应该以小写字母开头。

你知道 for 循环的“通常”形式吗?您正在使用的只是一个捷径:

for (int i = 0; i < [myArray count]; i++) {
    id obj = [myArray objectAtIndex:i];
    // do something with the object
}

所以在你的情况下,你可以写

NSArray *allKeys = [dictionary allKeys];
for (int i = 0; i < [allKeys count]; i++) {
    NSString *key = [allKeys objectAtIndex:i];
    NSObject *obj = [dictionary objectForKey:key];
    // do something 
}
于 2012-05-12T12:39:58.373 回答
1

for-in 循环不是这样工作的。它只需要一个对象来实现NSFastEnumeration协议并循环所有值,不多也不少。如果您需要在循环中使用键和值,则必须获取键的值:

for (id key in dictionary) {
   id value = [dictionary valueForKey: key];
   // do stuff with key and value
}

请注意,您不需要枚举 over [dictionary allKeys]NSDictionary实现NSFastEnumeration枚举键。

如果您不想自己查找值并且您的目标是可用块的操作系统(iOS 4.0 和 Mac OS X 10.6 或更高版本),您可以使用基于块的方法enumerateKeysAndObjectsUsingBlock:

[dictionary enumerateKeysAndObjectsUsingBlock:^( id key, id value, BOOL *stop ) {
    // do stuff with key and value
}];

使用您设置的基于块的方法*stopYES跳出循环,同时您可以break在常规循环中使用。

于 2012-05-12T12:47:59.537 回答
0

在迭代它们的内容之前,您需要连接两个数组:

NSMutableArray *allKeysAndValues = [NSMutableArray arrayWithArray:[Dictionary allKeys]];
[allKeysAndValues addObjectsFromArray:[Dictionary allValues]];
for (NSString* KeyOrValue in allKeysAndValues) {
    // Do something...
}

更好的方法是使用block枚举您的字典,如下所示:

[Dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];
于 2012-05-12T12:40:16.183 回答
0

我不认为你能做到这一点。只看这条线,编译器就存在语义问题。这是否意味着同时并行迭代 Key 和 Key2 ?这是否意味着只有在两个键都非零时才进入循环?这是否意味着通过两个集合的连接进行迭代?ETC...

在我看来,您的 Dictionary 可能不是您想要做的正确数据结构。

这对你想做的事情不起作用吗?

for (NSString* Key in [Dictionary allKeys]) {
    NSString* Key2 = [Dictionary objectForKey:Key]?
    // ...
}

或者,您可以尝试将两个集合连接到一个数组中并进行迭代,如果这是您想要的行为。

于 2012-05-12T12:41:25.287 回答