【问题标题】:ObjC: Best use an NSArray or NSDictionnary for this (zBuffer)?ObjC:最好为此使用 NSArray 或 NSDictionnary (zBuffer)?
【发布时间】:2012-04-28 09:04:37
【问题描述】:

假设我有一个“节点”实例的集合。一个整数属性调用 zIndex 将用于对它们进行分组。

存储它们的优点/缺点是什么: 1) 数组数组 2) 数组字典

在伪代码中,我会这样描述预期的结果:

zBuffer[100] = [node1, node 2];
zBuffer[105] = [playerNode, collectable1];
zBuffer[110] = [foreground1, foreground2];

我想知道 zBuffers 应该是什么; NSArrays 必须仅用于顺序读/写吗?喜欢不使用非连续索引?

我尝试使用 NSMutableArray:

[zBuffer objectAtIndex:zOrder]

但如果数组不包含该索引的数据(如越界异常),则会失败。

感谢您的建议! J

【问题讨论】:

    标签: objective-c arrays nsarray hashmap nsdictionary


    【解决方案1】:

    据我所知,您的要求之一是用于访问zBuffer 的索引不连续(100、105、100)。在这种情况下,我不会为此使用数组,因为您可以与数组一起使用的索引必须小于数组元素的count(如果您有 3 个元素,则索引范围从 0 到 2) .

    相反,我会使用NSMutableDictionary,您可以在其中使用 zIndex 键作为要查找的对象组的“名称”。

    此建议未考虑您可能有的任何其他要求,尤其是关于复杂性和您将对节点集合执行的操作类型(除了通过 zIndex 访问它们)。

    【讨论】:

    • 您好,感谢您的详细回答。这正是我所需要的,因为这个 zBuffer 的目的是跟踪“批处理节点”,以便在运行时添加新节点时获得正确的节点。
    【解决方案2】:

    您实际上可以同时提供两者。看起来您想要的是一个稀疏数组:因此您按索引查找对象,但允许在某个索引处没有对象。所以你可以做到。

    我会通过创建一个实现the primitive methods documentedNSMutableArray 子类来做到这一点。在内部,您的子类将使用 NSMutableDictionary 进行存储,并使用数字(“填充”索引)作为键。 -objectAtIndex: 返回以该数字为键的对象,如果此时数组为空,则返回 nil

    数组合约的这种使用存在一些歧义,由您决定如何解决:

    • count 是返回 1+(使用中的最高索引)还是数组中的对象数?
    • 枚举器和快速枚举模式永远不会期望看到nil,所以如果你希望你的类的用户枚举器,你需要想出一个总是返回一个对象的枚举器(但让我看看它在什么索引处)在数组上。
    • 您将无法使用 +arrayWithObjects: (id) firstObject,... 初始化模式对其进行初始化,因为它们使用 nil 作为标记。

    【讨论】:

    • 嘿,非常有趣的想法。我会把这个收藏在收藏夹中。在这种情况下,我将使用 NSMutableDictionnary!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多