2

-isEqual:カスタムクラスに実装しています。等式は、プロパティ値に基づいています。すべてのプロパティが等しい場合、オブジェクトは等しいと見なされます。従来のクラス チェックと合わせると、コードは次のようになります。

- (BOOL) isEqual: (id) object
{
    return [object class] == [self class]
        && [[object someProperty] isEqual:someProperty]
        && [[object otherProperty] isEqual:otherProperty];
}

しかし、これはnilプロパティ値では失敗します。nil値が格納されているクラスの 2 つのオブジェクトはsomeProperty等しくないと見なされますが、等しくしたいのです。したがって、次のバージョンに到達しました。

- (BOOL) isEqual: (id) object
{
    #define equals(a, b) ((a == b) || ([a isEqual:b]))
    return equals([object class], [self class])
        && equals([object someProperty], someProperty)
        && equals([object otherProperty], otherProperty);
}

これはうまくいくようです。これは、等式を解決するための「標準的な」方法ですか? 私には複雑すぎるようです。

4

1 に答える 1

2

isEqual:非常にオブジェクト固有です。それはセマンティックな平等です。isEqual の意味をクラスごとに定義するのはあなた次第です。したがって、それを行うための標準的な方法はありません。

最も単純な実装は ですreturn self == object。2 番目の実装は非常に一般的で優れていますが、必ずしもすべてのクラスに適しているとは限りません。たとえば、 の場合Person、電子メールを比較するだけで十分です。または、電子メールが複数の家族によって使用される可能性があると思われる場合は、電子メールと名を比較します。

于 2012-06-27T09:37:50.633 に答える