isEqual:Objective-C'de uygun şekilde nasıl geçersiz kılabilirsiniz ? "Yakala", iki nesne eşitse ( isEqual:yöntem tarafından belirlendiği gibi ), aynı karma değerine sahip olmaları gerektiği şeklindedir.
Introspection bölümü Kakao Temelleri Kılavuzu geçersiz kılmak nasıl bir örnek var isEqual:adında bir sınıf için, aşağıdaki gibi kopyalanabilir MyWidget:
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![other isKindOfClass:[self class]])
return NO;
return [self isEqualToWidget:other];
}
- (BOOL)isEqualToWidget:(MyWidget *)aWidget {
if (self == aWidget)
return YES;
if (![(id)[self name] isEqual:[aWidget name]])
return NO;
if (![[self data] isEqualToData:[aWidget data]])
return NO;
return YES;
}
İşaretçi eşitliğini, sonra sınıf eşitliğini denetler ve son olarak isEqualToWidget:yalnızca nameve dataözelliklerini denetleyen nesnelerini karşılaştırır . Ne örnek vermez göstermek geçersiz kılmak nasıl hash.
Diyelim ki eşitliği etkilemeyen başka özellikler var age. Olmamalı hashyöntemi yalnızca böyle geçersiz kılınabilir nameve datakarma etkiler? Ve eğer öyleyse, bunu nasıl yapardın? Sadece nameve data? Örneğin:
- (NSUInteger)hash {
NSUInteger hash = 0;
hash += [[self name] hash];
hash += [[self data] hash];
return hash;
}
Bu yeterli mi? Daha iyi bir teknik var mı? Ya ilkelleriniz varsa, mesela int? NSNumberOnların karma almak için onları dönüştürmek ? Veya gibi yapılar NSRect?
( Beyin osuruğu : Başlangıçta onları "bitsel VEYA" yazdı |=.
if (![other isKindOfClass:[self class]])- Bu teknik olarak eşitliğin Değişmeli olmayacağı anlamına gelir. Yani A = B, B = A anlamına gelmez (örneğin, biri diğerinin alt sınıfı ise)