【问题标题】:adding objects to Mutable array将对象添加到可变数组
【发布时间】:2011-09-14 15:35:45
【问题描述】:

我想将项目从字典添加到可变数组。问题是我想在添加新项目之前检查现有的数组项目。如果数组中已经存在相同的项目,我想替换它。否则添加新项目。 我怎么能做到?

【问题讨论】:

    标签: iphone objective-c ios ios4


    【解决方案1】:

    您也许可以使用NSMutableSet 而不是 NSMutableArray。 NSMutableSet 上的 addObject 方法只会“将给定对象添加到集合中,如果它还不是成员。”

    如果您想在添加到集合之前检查成员资格,您可以检查以下结果:

    [mySet containsObject:myObjectFromDictionary]

    ...返回一个简单的 BOOL 值,指示该集合是否已经包含一个对象,当您将对象传递给它时,该对象的 isEqual 方法返回 true。

    (对于一些额外的功能,NSCountedSet 将跟踪添加到 isEqual: 为其返回 true 的“集合”中的对象数量)

    【讨论】:

    • 如果新对象不需要替换旧项目,这将起作用; NSMutableSet 在数组中赋予原始对象优先级,而听起来 OP 希望新对象具有优先级 - 但也许让 OP 考虑替换旧对象是否是绝对必要的。
    • 如果新对象和原始对象在YESisEqual: 的响应实际上不相等,那么OP 的问题远比这个问题严重得多。 ...
    【解决方案2】:

    您可以比较 [yourArray indexOfObject:yourObject];NSNotFound 的结果,以了解对象是否在数组中。
    它将为您提供要替换的对象的索引,或者如果它等于NSNotFound,您将添加它。
    对象相等性使用isEqual: 方法进行测试。
    NSArray class reference

    【讨论】:

      【解决方案3】:

      从表面上看,文森特和里奇的答案都是正确的。

      但是,原始问题中存在一个尚未解决的概念问题。

      即,通过indexOfObject:(或集合中的containsObject:)的“数组成员资格”最终是通过使用isEqual: 比较两个对象来完成的。

      如果 isEqual: 返回 YES,那么这两个对象最好在您的代码中在功能上完全相同,否则您的设计和实现中还有其他更严重的问题。

      因此,真正的问题应该是“我如何检测一个对象是否已经在一个数组中而不添加它?” Rich 和 Vincent 的答案仍然是正确的。

      即您应该只需要检查是否存在,如果存在,则不采取任何措施。

      (请注意,在某些深奥的情况下实际上需要替换,但它们都是真正深奥的,通常不用于可变集合的上下文中)

      【讨论】:

      • 同意。大量的功能可以依赖于isEqual 的正确实现。关于此事here 有一篇很棒的 SO 帖子。 (另外,简单说明一下 NSArray 也支持 containsObject 方法,与 NSSet 一样,该方法返回 BOOL。)
      猜你喜欢
      • 2022-01-13
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      相关资源
      最近更新 更多