คุณจะแทนที่อย่างถูกต้อง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 (เช่นถ้ามีคลาสย่อยของอีกอัน)