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 name
ve 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ı hash
yöntemi yalnızca böyle geçersiz kılınabilir name
ve data
karma etkiler? Ve eğer öyleyse, bunu nasıl yapardın? Sadece name
ve 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
? NSNumber
Onları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)