如何以与NSLog相同的顺序进行循环迭代(@“%@”,arrData)

时间:2012-11-15 12:43:55

标签: objective-c

我执行了以下代码NSLog(@"%@", arrData);,预期调试器中的输出如下:

    "0." =     {
"first_name"="John"
    };

    "1." =     {
"first_name"="Florence"
    };

    "2." =     {
"first_name"="Melinda"
    };
    "3." =     {
"first_name"="Zack"
    };

然后我执行了这段代码:

for (NSDictionary *book in arrData)
{
        NSLog(@"%@ %@" , book, [[arrData objectForKey:book]  objectForKey:@"first_name"]);
}

输出就像这样:

2. Melinda
0. John
3. Zack
1. Florence

如何使for循环按照与?相同的顺序打印结果? NSLog(@"%@", arrData);

1 个答案:

答案 0 :(得分:8)

这里发生了一些事情。

首先让我们了解%@在NSLog中的含义。许多iOS / Cocoa开发人员错误地认为%@与NSString相关联,但事实并非如此。来自Apple's documentation

  

Objective-C对象,打印为descriptionWithLocale:返回的字符串(如果可用)或其他描述。也适用于CFTypeRef个对象,返回CFCopyDescription函数的结果。

因此,%@采用任何Objective-C或CFTypeRef对象。由于您使用的是NSDictionary%@会打印说明的输出或descriptionWithLocale:(id)locale。那怎么办?再次,从Apple的文档:

  

如果字典中的每个键都是NSString对象,则按键按升序列出条目,否则列出条目的顺序是未定义的。

当使用for-in循环,又称Fast-Enumeration时,对象的顺序是未定义的,因此这就是循环输出不按顺序的原因。如果要按顺序打印NSDictionary的内容,则必须模拟描述方法的行为。

来自this stackoverflow帖子:

NSArray *sortedKeys = [[dict allKeys] sortedArrayUsingSelector: @selector(compare:)];
NSMutableArray *sortedValues = [NSMutableArray array];
for (NSString *key in sortedKeys) {
    [sortedValues addObject: [dict objectForKey: key]];
}

我希望这能解决问题。

相关问题