2

假设我有一个NSArray,每个项目都是一个NSDictionary,具有三个键 keyA、keyB 和 keyC - 每个都引用未知类型的对象(id)

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

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

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

这是不好的做法吗?有没有更好的方法可以在不创建数据库的情况下做到这一点?

4

2 回答 2

1

你可以重写 isEqual 来为你的类型规定相等的概念。与其他语言相同的规则适用:

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

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

正如 Jason Whitehorn 所指出的,Objective-C 也有提供另一个 isEqualToMyType 方法以方便使用的约定。

AppCode、EqualsBuilder、样板代码

如果有像 Apache 的“EqualsBuilder”类这样的东西会很好,但与此同时,AppCode可以很好地为您实现这些方法。

于 2013-10-11T04:42:46.230 回答
0

isEqual: 方法比较对象身份,除非被子类覆盖。根据目标的类别,这可能是也可能不是您想要的。我更喜欢使用更具体的类比较,比如 isEqualToNumber: 仅仅是因为它是明确的。但是, isEqual 应该根据目标起作用。

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

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

于 2013-10-06T15:11:42.013 回答