2013-08-02 2 views
0

У меня есть обычай IsEqual для проверки равенства между объектами моего класса:Тестирование NSNumber для ноля в IsEqual

BOOL result = ([attempt.attemptId isEqualToNumber:self.attemptId] && 
     [attempt.pitcher isEqualToString:self.pitcher] && 
     [attempt.vsTeam isEqualToString:self.vsTeam] && 
     attempt.isHomeTeam == self.isHomeTeam && 
     [attempt.hitlessInnings isEqualToNumber:self.hitlessInnings] && 

... и т.д.

return result; 

Иногда какие-либо из этих свойств может быть нулевым , Когда строка равна нулю, равенство, похоже, работает должным образом. Но isEqualToNumber для NSNumber объектов не удается полностью:

[NSNull isEqualToNumber:]: unrecognized selector sent to instance 0x1896678' 

Как я могу проверить на ноль в isEqual и вернуть YES, когда оба объекта имеют ноль для этого свойства?

+0

В этом случае вы не проверяете 'nil', вы проверяете, действительно ли объект является экземпляром' NSNull' вместо экземпляра 'NSNumber'. – rmaddy

+0

Ваша проблема в том, что вы не вызываете isEqualToNumber: в NSNumber это экземпляр NSNull. Моя рекомендация заключается в том, что везде, где вы получаете этот NSNull (разбор некоторых JSON или что-то еще?), Проверьте свою собственность для NSNull и измените ее на нуль. (например: 'if (попытка.hitlessInnings == [NSNull null]) {try.hitlessInnings = nil;}' Или использовать предложение rmaddy. –

+0

Да, я разбираю JSON - я вижу, поэтому, если я проверяю NSNull при настройке номер, и при необходимости установить значение nil, я могу оставить эту реализацию isEqual as-is? –

ответ

1

Вообще при написании методы равенства следует:

  1. Проверьте класс объекта сравнивается первым
  2. Проверьте локальный объект и сравниваемые свойства объекта для nil
  3. Проверьте локальный объект и сравниваемые свойства объекта для равенства

Если вы передаёте NSNull вместо nil, то это ошибка в обработке и проверке JSON, которая должна быть исправлена. Вы также должны проверить случай nil явно, поскольку nil == nil истинно, но [nil isEqual:nil] является ложным.

+0

Коренная проблема здесь определенно фасад t, что свойства содержат объекты неправильного типа ('NSNull' вместо' NSNumber'). –

+0

NSNull - это действительный результат, который может быть отправлен из JSON, вы должны обрабатывать эту возможность во время разбора JSON - когда вы возвращаете словарь или массив из преобразования JSON, вы можете иметь запись nil, поэтому NSNull используется. Вы должны убедиться, что переходите от словаря к реальным свойствам объекта, чтобы любые значения NSNull были преобразованы в нуль. –

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