所以我有一种情况,我使用类作为一种结构。现在我想覆盖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
中包含哪个鸭子并返回它的索引(我可以这样做,只是想尝试冷静)并且在同一时间整洁)
答案 0 :(得分:2)
听起来使用-isEqual:
这是一个坏主意。
你不能将DuckAndChicken与其鸭子及其鸡肉进行比较(反之亦然),因为为了保持一致,所有鸭子和鸡只必须相等。
示例:
好消息是您不必使用-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与数组中的索引。这样可以更快地查找,但会占用更多内存,并且可以在三个数据结构之间进行同步。