我执行了以下代码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);
答案 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]];
}
我希望这能解决问题。