2012-05-12 82 views
1

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

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

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

回答

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 
} 
0

你需要遍历其内容之前来连接两个数组:

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

一个更好的方法将枚举你的字典用,像这样:

[Dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) { 
    NSLog(@"%@ = %@", key, object); 
}]; 
+0

Downvoter,谨慎地阐述? – dasblinkenlight

+0

减轻+1。 – CodaFi

0

我不认为你可以这样做。只看线,编译器就有语义问题。这是否意味着同时并行地迭代Key和Key2?这是否意味着只有在两个密钥都不是零的情况下才能进入循环?这是否意味着迭代两组的连接? etc ...

听起来像我的喜欢你的字典可能不是你想要做的正确的数据结构。

这不适用于你想要做的事情吗?

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

或者你可以尝试连接两个集合在单个数组中,然后迭代,如果这是你想要的行为。

3

NSDictionary为此提供了一个特殊的基于块的方法,包括:

[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
    // do something with key and obj 
}]; 
+0

我试着添加这个,但它没有工作。它允许你做什么?我现在面临的主要问题是数据不是按顺序显示的,而是混淆了。这会解决问题吗? – Alessandro

+0

当然它没有排序。根据定义,字典的键具有未定义的顺序。如果您想对键进行排序,请使用'allKeys'将它们放入数组中并对该数组进行排序。然后遍历数组,如其他答案所示。 –

1

的for-in循环不这样工作。它只需要一个实现NSFastEnumeration协议的对象并循环遍历所有的值,没有什么比这更简单了。如果您需要使用您的循环内的键和值,你必须得到该键的值:

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

请注意,您不需要枚举[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基于块的方法。