NSDictionary的allKeys数组搞砸了 - 不是按照它们在字典中的顺序?

Mar*_*man 5 iphone nsdictionary plist nsarray ios

在我的项目中,我从.plist中提取数据,更具体地说是从NSDictionary中提取数据.我使用.plist的内容初始化一个字典,效果很好.当我这么做的时候

NSArray *array = [dict allKeys];
Run Code Online (Sandbox Code Playgroud)

它用所有键填充数组,但是以完全随机的顺序填充,与.plist文件中的顺序不同.我真的需要保留订单.字典中的键是数组,如果这可能会导致问题.我得不到什么?

非常感谢提前!

小智 7

就像NSSet中的项目之间没有顺序一样,NSDictionary中的键值对没有固有的顺序.

如果你想要特定订单下的密钥,你需要使用类似- (NSArray *)keysSortedByValueUsingComparator:(NSComparator)cmptr但不会给出在plist文件中序列化NSDictionary的顺序.

  • 如果你想要_"plist文件中存储键值的顺序是什么?"_那么简答题是"否".答案很长:除非你想要手动解析plist文件的负担.NSDictionaries持有_unordered_键值对.NSArrays包含_ordered_项.如果您是存储和读回数据的人,可能需要使用NSArray来存储数据. (2认同)

Raj*_*shu 6

没有这样的内置方法可以从中获得这个.但是一个简单的逻辑工作对你而言.在准备字典时,您只需在每个键前添加一些数字文本即可.喜欢

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:
                       @"01.Created",@"cre",
                       @"02.Being Assigned",@"bea",
                       @"03.Rejected",@"rej",
                       @"04.Assigned",@"ass",
                       @"05.Scheduled",@"sch",
                       @"06.En Route",@"inr",
                       @"07.On Job Site",@"ojs",
                       @"08.In Progress",@"inp",
                       @"09.On Hold",@"onh",
                       @"10.Completed",@"com",
                       @"11.Closed",@"clo",
                       @"12.Cancelled", @"can",
                       nil]; 
Run Code Online (Sandbox Code Playgroud)

现在,如果您可以使用sortingArrayUsingSelector,同时获得与您放置的顺序相同的所有键.

 NSArray *arr =  [[dict allKeys] sortedArrayUsingSelector:@selector(localizedStandardCompare:)];
Run Code Online (Sandbox Code Playgroud)

在你想要在UIView中显示键的地方,只需砍掉正面3字符即可.