【问题标题】:Is NSDictionary key order guaranteed the same as initialized if it never changes?如果 NSDictionary 键顺序从不改变,它是否保证与初始化相同?
【发布时间】:2015-08-16 09:08:35
【问题描述】:

我遇到了与 in this question 相同的问题。但是,我有一个后续问题。我似乎与最初的提问者处于相同的情况:我有一个 plist,其中包含定义配置屏幕的字典层次结构。这些是可变的并且在整个应用程序中保持不变。由于最初的讨论似乎集中在改变字典引起的问题上,我必须要求确认:字典的顺序是否保证与 plist 中的顺序相同,即读取时(使用 initWithContentsOfFile)?如果字典永远不会改变,我可以在这种情况下使用 allKeys 来获取正确顺序的键数组吗?

【问题讨论】:

    标签: iphone objective-c cocoa nsdictionary


    【解决方案1】:

    什么都没有保证顺序。甚至不能保证对字典进行两次迭代会以相同的顺序为您提供键。

    【讨论】:

      【解决方案2】:

      我不会假设密钥会按任何顺序排列,因为allKeys 不保证顺序。

      在内部,NSDictionary uses a hash table

      来自allKeys description

      数组中元素的顺序 没有定义。

      如果您想按某种顺序显示值,则获取键,对键数组进行排序,然后获取每个键的值。

      【讨论】:

        【解决方案3】:

        如果您需要维持秩序的NSDictionary,请查看CHDataStructure's CHOrderedDictionary,它正是这样做的。我一直在使用它。

        【讨论】:

        • 我在 iPhone 上需要它,所以 Cocoa Touch。我想知道它是否在上面运行?无论如何,我会回答我自己的问题:不,显然不能期望 NSDictionary 以任何顺序排列。所以,我正在做我看到其他人建议的事情:包含一个带有顺序和键“_order”的数组。人们一直在说这种笨拙的双重数据保存在他们看来一点也不笨拙。不过还是很笨重。
        • 是的,CHDataStructures 可以在 Mac 和 iPhone 上运行。
        【解决方案4】:

        不,密钥的出现顺序可能与您的 plist 文件的顺序不同。我无法查看引擎盖下的内容,但我猜想这些键是以提供有效查找的任何方式排序的。 allKeys 的文档说未定义数组中元素的顺序。

        【讨论】:

        • 我的应用确实以与 plist 相同的顺序显示它们,这是我开始怀疑的原因之一。但我现在知道它是未定义的。
        • 在我的应用程序中,它们并不总是以与 plist 相同的顺序显示 - 取决于当时正在读取的 plist。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-16
        • 1970-01-01
        • 1970-01-01
        • 2020-09-11
        • 1970-01-01
        相关资源
        最近更新 更多