0

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

但是,现在说obj包含名为鸭子和鸡的对象,我想去[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's 以查找其中包含哪个鸭子obj并返回它的索引(我可以这样做,只是想尝试同时保持凉爽和整洁)

4

3 回答 3

2

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

你不能有一个 DuckAndChicken 与它的 Duck 和它的 Chicken 比较(反之亦然),因为为了保持一致,所有的鸭子和鸡都必须比较相等。

例子:

  1. 鸭 1 + 鸡 1 比较等于鸭 1
  2. 鸡 1 比较等于鸭 1 + 鸡 1
  3. 鸭2 + 鸡1 比较等于鸡1
  4. 鸭2比较等于鸭1
  5. 宇宙爆炸

好消息是您不必使用-indexObject:从数组中检索。NSArray 有一个方便的-indexOfObjectPassingTest:方法,可以做你想做的事。

        [ducksAndChickens indexOfObjectPassingTest:^BOOL(DuckAndChicken *obj, NSUInteger idx, BOOL *stop) {
            if ([obj.duck isEqual:myDuck]) {
                // woop woop...
            }
        }];
于 2013-07-12T13:13:24.360 回答
1

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

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

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

于 2013-07-12T12:37:58.763 回答
1

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

于 2013-07-12T12:54:43.627 回答