2013-08-03 1 views
3

EDITСравнивая нильполугруппы свойства в IsEqual

Из первоначальных ответов, я не был достаточно ясен. Я просто хочу проверить равенство между объектами моего собственного пользовательского класса, а результат зависит от его свойств (довольно стандартный, я считаю)? Бит, с которым я изо всех сил стараюсь, чтобы свойство считалось равным, когда оба экземпляра имеют нуль для этого свойства.

END EDIT

Я хочу, чтобы объекты моего пользовательского класса, чтобы вернуться YES для isEqual всякий раз, когда все его свойства такие же, как у объекта, переданного в качестве аргумента. Это должно включать, когда и свойства: 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, а также избежать отправки isEqualToNumber или isEqualToString к нулю.

Для BOOL с я предположил бы, что это не обязательно так как BOOL не может быть nil - будет простым == хватает для булевых?

Все, что у меня отсутствует, или какие-либо способы улучшить это?

+1

Так что вы хотите метод, который возвращает 'YES' при вызове как' [ноль someEqualityTest: ноль] ' ? - Кроме того, да, 'BOOL' является примитивным типом,' == 'работает так, как ожидалось. –

+0

Проблема заключалась бы в том, чтобы получить '[nil isEqual: nil]' даже для вызова вашего 'isEqual'. –

+0

Нет, я просто пытаюсь проверить [myObject isEqual: myObject] и вернуть YES, когда все свойства совпадают. Я хочу, чтобы оба свойства были nil, чтобы быть «совпадением». –

ответ

5

Поскольку вы не можете (хорошо, это просто не очень хорошая идея) переопределить isEquals для всех типов объектов, включая nil, очевидный выбор состоит в том, чтобы просто сделать отдельную простую функцию для времени, в котором вы нуждаетесь;

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

Итак, если a равно nil и b не равно nil, я буду исполнять [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

Спасибо. Заключительный вопрос - does isEqual всегда просто вызывает эквивалент isEqualTo *? Я бы предпочел использовать isEqualToDate, isEqualToString (мне просто нравится ясность). Но я буду использовать isEqual, как вы предлагаете, если он будет делать соответствующую вещь в зависимости от класса получателя. –

0

nil не может позвонить isEqual, так как это ... ну ноль. Он не знал бы, к какому isEqual позвонить. Это не объект. Я не знаю, как это сделать, и сомневаюсь, что вас нет (кто-то, пожалуйста, поправьте меня, я бы хотел увидеть реализацию для этого).

Это, как говорится, как правило, вы должны проверить с нулевыми указателями перед тем вызовом isEqual так:

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

Это даст вам то, что вы хотите, и вы можете легко создать блок (или, может быть, макро) так что вам не придется вводить это каждый раз.

+0

Я пытаюсь сравнить свойства объекта, а не сами объекты. –

+0

@BenPackard и, тем не менее, это точно так же, как ответ, который вы приняли. –

+0

Это неточно. Ответ - это больше, чем просто код, который он включает. В принятом ответе была лучшая работа, объясняющая, как и где это будет использоваться, по крайней мере, по словам искателя (и на основе последующих солнечных лучей). –

 Смежные вопросы

  • Нет связанных вопросов^_^