【发布时间】:2011-09-14 15:35:45
【问题描述】:
我想将项目从字典添加到可变数组。问题是我想在添加新项目之前检查现有的数组项目。如果数组中已经存在相同的项目,我想替换它。否则添加新项目。 我怎么能做到?
【问题讨论】:
标签: iphone objective-c ios ios4
我想将项目从字典添加到可变数组。问题是我想在添加新项目之前检查现有的数组项目。如果数组中已经存在相同的项目,我想替换它。否则添加新项目。 我怎么能做到?
【问题讨论】:
标签: iphone objective-c ios ios4
您也许可以使用NSMutableSet 而不是 NSMutableArray。 NSMutableSet 上的 addObject 方法只会“将给定对象添加到集合中,如果它还不是成员。”
如果您想在添加到集合之前检查成员资格,您可以检查以下结果:
[mySet containsObject:myObjectFromDictionary]
...返回一个简单的 BOOL 值,指示该集合是否已经包含一个对象,当您将对象传递给它时,该对象的 isEqual 方法返回 true。
(对于一些额外的功能,NSCountedSet 将跟踪添加到 isEqual: 为其返回 true 的“集合”中的对象数量)
【讨论】:
YES 对isEqual: 的响应实际上不相等,那么OP 的问题远比这个问题严重得多。 ...
您可以比较 [yourArray indexOfObject:yourObject]; 和 NSNotFound 的结果,以了解对象是否在数组中。
它将为您提供要替换的对象的索引,或者如果它等于NSNotFound,您将添加它。
对象相等性使用isEqual: 方法进行测试。
NSArray class reference。
【讨论】:
从表面上看,文森特和里奇的答案都是正确的。
但是,原始问题中存在一个尚未解决的概念问题。
即,通过indexOfObject:(或集合中的containsObject:)的“数组成员资格”最终是通过使用isEqual: 比较两个对象来完成的。
如果 isEqual: 返回 YES,那么这两个对象最好在您的代码中在功能上完全相同,否则您的设计和实现中还有其他更严重的问题。
因此,真正的问题应该是“我如何检测一个对象是否已经在一个数组中而不添加它?” Rich 和 Vincent 的答案仍然是正确的。
即您应该只需要检查是否存在,如果存在,则不采取任何措施。
(请注意,在某些深奥的情况下实际上需要替换,但它们都是真正深奥的,通常不用于可变集合的上下文中)
【讨论】:
isEqual 的正确实现。关于此事here 有一篇很棒的 SO 帖子。 (另外,简单说明一下 NSArray 也支持 containsObject 方法,与 NSSet 一样,该方法返回 BOOL。)