2011-12-13 91 views
2

請在這個代碼看看:爲什麼兩個自定義對象的定義方式完全相同?

Card *first = [[Card alloc] initWithFace:@"Ace" andSuit:@"Hearts"]; 
Card *second = [[Card alloc] initWithFace:@"Ace" andSuit:@"Hearts"]; 

if ([first isEqual:second]) 
    NSLog(@"Equal"); 
else 
    NSLog(@"Not equal"); //WHY??? 

的NSLog告訴我這兩個對象是不相等的。但爲什麼?我該怎麼做才能讓他們平等呢?

回答

14

您必須在Card類中實現您自己的isEqual:方法。

這會比較傳入的卡片對象的面部和花色,並返回相應的BOOL值。有關基礎(NSObject)實現的更多詳細信息,請參閱here以及如何修改它。

一個未經考驗的,類型化的,在瀏覽器的執行將是這樣的:

-(BOOL)isEqual:(id)compareObject 
{ 
    if (self == compareObject) 
     return YES; 

    if (![compareObject isKindOfClass:[self class]) 
     return NO; 

    Card *compareCard = (Card*)compareObject; 
    if ([compareCard.face isEqualToString:self.face] && [compareCard.suit isEqualToString:self.suit]) 
     return YES; 
    else 
     return NO; 
} 

還必須實現這樣hash兩個相等的對象返回相同的哈希值。

3

我寫這作爲回答另一個問題,但它回答你相當不錯:


在Objective-C檢查==身份。那就是兩個指針是否指向同一個對象。

爲了測試平等使用:[objectA isEqual:objectB]。默認情況下,它的作用與==相同,但可以重寫爲自定義相等。

+0

I DO USE isEqual!它不起作用 –

+0

閱讀開始的位:「默認情況下...」 –

+0

哦,你是對的,對不起我的注意力不集中 –

0

「isEqual」的意思是「他們是同一個對象嗎?」,他們不是。你想測試「他們有相同的價值嗎?」。