【问题标题】:NSDictionary literals position at run-time [duplicate]NSDictionary 文字在运行时的位置 [重复]
【发布时间】:2014-11-04 09:01:01
【问题描述】:

在定义 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 在用字面量初始化时是如何初始化的,有没有办法确保键值对在使用字面量时位于定义的位置?

-- 编辑--

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

@[
    @[ @"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]]];

【问题讨论】:

  • 您的问题没有任何意义,只要您仅通过 –valueForKey:–valueForKeyPath:)访问 ,所以元素的实际顺序真的无关紧要。无论如何,你想达到什么目标?
  • 我想要一个 ViewController 来显示属性和动作,不同的选定项不同,在不同的 tableViews 中。我设置属性和值,然后对具有选择器名称的项目可用的操作。对于操作,我可能需要在所有操作之后显示“删除”操作。

标签: ios objective-c object-literal


【解决方案1】:

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

如果你想要一个有序的字典,参考这个链接

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

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

或者直接用 NSArray 代替 NSDictionary,一个数组保存键,另一个数组保存值

希望对你有帮助

【讨论】:

  • 谢谢,这很有用...我决定使用二维 NSArray 而不是 NSDictionary。这样我就解决了“动作名称”、“动作标题”、“动作值”的问题。
  • @slava 以牺牲查找速度为代价。
  • @trojanfoe 可能,但我只使用了 6 个项目。我知道这不是编写低效代码的借口,但是……我还能做什么,使用普通的 C 数组?如何?我正在尝试为 ViewController 设置数据源,其中包含显示属性值列表和操作(针对选定项目)的表
  • @slava 你两个都用。保存实际数据的键/值的字典和保存您希望该数据出现的顺序的键数组,允许重新排序等。
猜你喜欢
  • 2014-05-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多