我试图在for循环中使用多个值。如果我创建两个单独的for循环,代码重复两次,所以我试过这个:循环的多个条件
for ((NSString* Key in [Dictionary allKeys]) && (NSString* Key2 in [Dictionary allValues])){
但是没办法!我该怎么做??
我试图在for循环中使用多个值。如果我创建两个单独的for循环,代码重复两次,所以我试过这个:循环的多个条件
for ((NSString* Key in [Dictionary allKeys]) && (NSString* Key2 in [Dictionary allValues])){
但是没办法!我该怎么做??
首先,变量名称应该以小写字母开头。
你知道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
}
你需要遍历其内容之前来连接两个数组:
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);
}];
我不认为你可以这样做。只看线,编译器就有语义问题。这是否意味着同时并行地迭代Key和Key2?这是否意味着只有在两个密钥都不是零的情况下才能进入循环?这是否意味着迭代两组的连接? etc ...
听起来像我的喜欢你的字典可能不是你想要做的正确的数据结构。
这不适用于你想要做的事情吗?
for (NSString* Key in [Dictionary allKeys]) {
NSString* Key2 = [Dictionary objectForKey:Key]?
// ...
}
或者你可以尝试连接两个集合在单个数组中,然后迭代,如果这是你想要的行为。
NSDictionary
为此提供了一个特殊的基于块的方法,包括:
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
// do something with key and obj
}];
我试着添加这个,但它没有工作。它允许你做什么?我现在面临的主要问题是数据不是按顺序显示的,而是混淆了。这会解决问题吗? – Alessandro
当然它没有排序。根据定义,字典的键具有未定义的顺序。如果您想对键进行排序,请使用'allKeys'将它们放入数组中并对该数组进行排序。然后遍历数组,如其他答案所示。 –
的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
}];
您设定*stop
到YES
打出来的循环,而你可以在常规循环使用break
基于块的方法。
Downvoter,谨慎地阐述? – dasblinkenlight
减轻+1。 – CodaFi