iOS:枚举时的对象相等

时间:2013-10-06 15:03:23

标签: ios objective-c cocoa-touch

假设我有NSArray,每个项目都是NSDictionary,其中包含三个键keyA,keyB和keyC - 每个键都指向未知类型(id)的对象。

如果我想编写一个方法,用这三个键找到给定的元素,即

-(NSDictionary *) itemThatContainsKeys:(id)objectA and:(id)objectB and:(id)objectC

我会通过简单地枚举并通过if([i objectForKey:(keyA) isEqualTo:objectA])等测试对象平等而遇到麻烦吗?我将传递在字典初始化中设置的实际对象 - 即不是具有相同值但位置不同的字符串。

这是不好的做法吗? 没有创建数据库,有没有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以覆盖isEqual以规定您的类型的相等概念。适用的规则与其他语言相同:

  • 如果您提供equals的实现,则应提供'hash'的实现
  • “相等”的对象应具有相同的“哈希”
  • 等于应该是可传递的 - >如果A等于B,B等于C,则C必须等于A.
  • 等于应该是双向的 - >如果A等于B,则B必须等于A.

这将确保像NSSet这样的类中的可预测行为,这些类使用哈希来提高性能,在发生冲突时回退到等于。

正如Jason Whitehorn所说,Objective-C也有为了方便而提供另一种isEqualToMyType方法的惯例。

AppCode,EqualsBuilder,Boiler-plate代码

如果有类似Apache的'EqualsBuilder'类,那会很好,但与此同时AppCode可以很好地为您实现这些方法。

答案 1 :(得分:0)

isEqual:方法比较对象标识,除非被子类覆盖。根据目标的类别,今年五月或可能不是您想要的。我更喜欢使用像isEqualToNumber这样的更具体的比较:仅仅因为它的显而易见性。但是,isEqual应该依赖于目标。

除此之外,并不知道你正在做什么的更多具体细节,很难说是否有更好的方法来完成你所追求的目标。但是,这是我的想法;

字典数组几乎听起来像您可能需要一个自定义类来表示应用程序中的某些构造。也许字典可以替换为您实现isEqualToAnotherThing:方法的自定义对象。这应该简化你的逻辑。