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 ループを使用してすべての my を検索し、objどのアヒルが含まれているかを見つけてobj、そのインデックスを返す必要があります (これは可能です。同時にクールできちんとしたかっただけです)。

4

3 に答える 3

1

はい、ハッシュの問題のようです。

isEqual:壊れるとは思わないものを壊す可能性があるため、オーバーライドしてこれを実行しようとすることは避けます。

代わりに、同等のバージョンを判断するために呼び出すことができるカスタム メソッドを追加します。次に、反復NSArrayを追加および実行するヘルパー メソッドまたはカテゴリを用意します。my_indexOfObject:

于 2013-07-12T12:37:58.763 に答える
1

あなたの例から本当にやりたいことを伝えるのは難しいですが、アヒルがキーで、ニワトリがキーで、オブジェクト値が実際の親オブジェクトまたはインデックスを持つ NSNumber のいずれかである 2 つの辞書を持つことができますか?配列。これにより、ルックアップがはるかに高速になりますが、より多くのメモリが必要になり、3 つのデータ構造体間で同期を行うことができます。

于 2013-07-12T12:54:43.627 に答える