重写isEqual:这样不同的对象可以等于同一个对象(排序)

时间:2013-07-12 12:34:08

标签: objective-c

所以我有一种情况,我使用类作为一种结构。现在我想覆盖isEqual:方法,所以如果这种类型的对象在数组中,我可以使用[objects indexOfObject:obj]

但是,现在说obj包含名为duck和chicken的对象,我想去[objects indexOfObject:duck],它实际上会给我obj的索引

所以我试过这样的事情:

- (BOOL)isEqual:(id)anObject {

    if([anObject isKindOfClass:[Duck class]]){

        return [anObject isEqual:_duck];
    }
    else if([anObject isKindOfClass:[Chicken class]]){

        return [anObject isEqual:_chicken];
    }

    return [anObject isEqual:self];
}

哪个不起作用,甚至没有被调用...认为这与覆盖哈希有关,我试图通过返回self.hash(实际上是obj.hash)但是没有用。

你觉得这样的事情有可能吗?或者我应该使用for循环来搜索我的所有obj以查找哪个obj中包含哪个鸭子并返回它的索引(我可以这样做,只是想尝试冷静)并且在同一时间整洁)

3 个答案:

答案 0 :(得分:2)

听起来使用-isEqual:这是一个坏主意。

你不能将DuckAndChicken与其鸭子及其鸡肉进行比较(反之亦然),因为为了保持一致,所有鸭子和鸡只必须相等。

示例:

  1. duck1 + chicken1比较等于duck1
  2. chicken1比较等于duck1 + chicken1
  3. duck2 + chicken1比较等于chicken1
  4. duck2比较等于duck1
  5. 宇宙爆炸
  6. 好消息是您不必使用-indexObject:从阵列中检索。 NSArray有一个方便的-indexOfObjectPassingTest:方法,可以做你想要的。

            [ducksAndChickens indexOfObjectPassingTest:^BOOL(DuckAndChicken *obj, NSUInteger idx, BOOL *stop) {
                if ([obj.duck isEqual:myDuck]) {
                    // woop woop...
                }
            }];
    

答案 1 :(得分:1)

是的,这听起来像哈希问题。

我会通过覆盖isEqual:来避免尝试这样做,因为你可能会破坏你认为不会破坏的东西。

而是添加一个自定义方法,您可以调用该方法来确定等效版本。然后在NSArray上添加辅助方法或类别,添加my_indexOfObject:并进行迭代。

答案 2 :(得分:1)

很难从你的例子中说出你真正想做的事情,但是你可能有两个字典,其中鸭子是关键,一个是鸡是关键,对象值是实际的父对象或NSNumber与数组中的索引。这样可以更快地查找,但会占用更多内存,并且可以在三个数据结构之间进行同步。