2013-08-03 21 views
3

編輯的isEqual中

從最初的答案比較爲零的特性,我不太清楚。我只是想檢查我自己的自定義類的對象之間的平等,結果取決於它的屬性(我相信相當標準)?我正在努力的一點是確保當兩個實例對該屬性都爲零時,將屬性視爲相等。

編輯完

我想我的自定義類的對象返回YESisEqual,每當它的所有屬性都相同,作爲參數傳遞的對象。這應包括屬性均爲nil。我最近得知[nil isEqual:nil]返回NO

下面的實現將實現我在找什麼?

- (BOOL)isEqual:(id)object 
    { 
     if (object == self) 
      return YES; 
     if (!object || ![object isKindOfClass:[self class]]) 
      return NO; 

     return (
      (!object.numberProperty && !self.numberProperty) || (object.numberProperty && self.numberProperty && [object.numberProperty isEqualToNumber:self.numberProperty]) 
      && 
      (!object.stringProperty && !self.stringProperty) || object.stringProperty && self.stringProperty && [object.stringProperty isEqualToNumber:self.stringProperty]) 
     ...etc 
     ); 
    } 

我試圖返回YES當兩個屬性nil,也避免發送isEqualToNumberisEqualToString爲零。

對於BOOL s我想這不是必須的,因爲BOOL不能是nil - 簡單的==就足夠布爾值嗎?

我錯過了什麼,或者任何改善這種情況的方法?

+1

所以,你想叫的時候一樣,返回'YES'的方法'[零someEqualityTest:無]' ? - 除此之外,是的,'BOOL'是一個原始類型,'=='按預期工作。 – 2013-08-03 14:12:02

+0

問題是要讓'[nil isEqual:nil]'調用你的'isEqual'。 –

+0

不,我只是想檢查[myObject isEqual:myObject],並在所有屬性匹配時返回YES。我希望這兩個屬性都不是'匹配'。 –

回答

5

因爲你不能(好吧,這不是一個好主意)覆蓋isEquals所有對象類型,包括nil,顯然的選擇是爲你需要的時間做一個單獨的簡單函數;

BOOL nilEqual(id a, id b) 
{ 
    return (a == nil && b == nil) || [a isEqual:b]; 
} 
+0

那麼,如果a是零而b不是零,我將執行[nil isEqual:b] - 那好嗎?同樣對於[a isEqual:nil]?我想在每種情況下,我會得到預期的否? –

+0

@BenPackard沒問題,因爲[isEqual](http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/isEqual :)在NSObject上記錄爲允許'nil'。 –

+0

謝謝。最後一個問題 - 是否等於總是調用等價的isEqualTo *?我寧願使用isEqualToDate,isEqualToString(我只是喜歡它的清晰度)。但是我會根據你的建議使用isEqual,如果它會根據收件人的類來做適當的事情。 –

0

nil不能撥打isEqual,因爲它是......很好。它不知道要撥打哪個isEqual。這不是一個對象。我不知道有辦法做到這一點,並懷疑有人離開(有人請糾正我,我很樂意看到這個實施)。

話雖這麼說,你通常需要調用isEqual所以之前檢查零指針

if ((!someObject && !otherObject) || [someObject isEqual:otherObject]); 

這會給你想要的東西,你可以很容易地創建一個塊(或者宏)所以你不必每次都輸出。

+0

我想比較對象的屬性,而不是對象本身。 –

+0

@BenPackard,然而,這與你接受的答案完全一樣。 –

+0

這是不準確的。答案不僅僅是它包含的代碼。被接受的答案在解釋如何以及在何處使用這個問題方面做得更好,至少根據提問者(以及根據日後的提案)來解釋。 –

相關問題