NSDictionary文字在运行时的位置

时间:2014-11-04 09:01:01

标签: ios objective-c object-literal

在定义键值对时,如何确保键值对在 NSDictionary 中的位置?

例如,如果我定义:

[detailsView setDatasource: @[ 
   @[@"Details",
      @{ @"title_1":@"description1",
         @"title_2":@"description2",
         @"title_3":@"description3",
         @"title_4":@"description4" }],
   @[@"Actions",
      @{ @"Action_1":[NSNull null],
         @"Action_2":[NSNull null],
         @"Action_3":[NSNumber numberWithBool:false] }]
];

然后在运行时我有不同的项目顺序

[detailsView setDatasource: @[ 
   @[@"Details",
      @{ @"title_2":@"description2",
         @"title_3":@"description3",
         @"title_4":@"description4",
         @"title_1":@"description1" }],
   @[@"Actions",
      @{ @"Action_3":[NSNumber numberWithBool:false],
         @"Action_1":[NSNull null],
         @"Action_2":[NSNull null]}]
];

此行为无法预测...... 在使用文字初始化NSDictionary时如何初始化NSDictionary,是否有办法确保在使用文字时键值对将处于定义的位置?

- 编辑 -

不是一个出色的解决方案,但有效。我最终这样做了:

@[
    @[ @"Route details",
         @[
              @[@"route-direction", @"Route direction", [NSString stringWithFormat:@"%@ → %@", journey[@"from"], journey[@"to"]]],
              @[@"poi-count", @"Points of interest", journey[@"pois-count"]],
              @[@"date-created", @"Date created", journey[@"created-at"]],
          ]
     ],
    @[ @"Actions" ,
         @[
             @[@"favourite", @"Favourite", ( [journey objectForKey:@"favourite"] ? [journey objectForKey:@"favourite"] : [NSNumber numberWithBool:false])],
             @[@"load",@"Load now",[NSNull null]],
             @[@"delete",@"Delete",[NSNull null]],
          ]
     ],
[NSNumber numberWithInteger: indexPath.row]]];

1 个答案:

答案 0 :(得分:0)

NSDictionary不是一个有序的容器。如果你使用它,你不应该关心数据的顺序。

如果您需要有序词典,请参阅此链接

http://www.cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html

或者你可以写另一个NSArray/NSMutableArray来保持这个NSDictionary的键顺序。

或者只使用NSArray而不是NSDictionary,一个数组保留键,另一个数组保留值

希望这可能会有所帮助