คุณจะแทนที่อย่างถูกต้องisEqual:ใน Objective-C ได้อย่างไร? "การจับ" ดูเหมือนว่าถ้าวัตถุสองตัวเท่ากัน (ตามที่กำหนดโดยisEqual:วิธีการ) พวกเขาจะต้องมีค่าแฮชเดียวกัน
วิปัสสนาส่วนของคู่มือความรู้พื้นฐานโกโก้จะมีตัวอย่างเกี่ยวกับวิธีการแทนที่isEqual:คัดลอกดังต่อไปนี้สำหรับการเรียนที่ชื่อ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;
}
มันตรวจสอบความเท่าเทียมกันของตัวชี้จากนั้นความเท่าเทียมกันของคลาสและในที่สุดก็เปรียบเทียบวัตถุที่ใช้isEqualToWidget:ซึ่งจะตรวจสอบnameและdataคุณสมบัติเท่านั้น อะไรเช่นไม่hashแสดงคือวิธีการแทนที่
สมมติว่ามีคุณสมบัติอื่น ๆ ageที่ไม่ส่งผลกระทบต่อความเสมอภาคการพูด ไม่ควรhashแทนที่เมธอดดังกล่าวเท่านั้นnameและdataส่งผลต่อแฮช และถ้าเป็นเช่นนั้นคุณจะทำอย่างไร เพียงเพิ่มแฮชของnameและdata? ตัวอย่างเช่น:
- (NSUInteger)hash {
NSUInteger hash = 0;
hash += [[self name] hash];
hash += [[self data] hash];
return hash;
}
เพียงพอหรือไม่ มีเทคนิคที่ดีกว่านี้ไหม? ถ้าคุณมีพื้นฐานเช่นintอะไร แปลงNSNumberเป็นแฮชของพวกเขาเหรอ? หรือ structs เป็นNSRectอย่างไร
( สมองผายลม : เดิมเขียนว่า "bitwise OR" ร่วมกับพวก|=มันหมายถึงเพิ่ม)
if (![other isKindOfClass:[self class]])- เทคนิคนี้หมายถึงความเท่าเทียมกันจะไม่สลับกัน Ie A = B ไม่ได้หมายถึง B = A (เช่นถ้ามีคลาสย่อยของอีกอัน)