Вы должны иметь метод betterThan:
return NSOrderedSame
. Все методы, которые возвращают NSComparisonResult
, всегда должны иметь возможность возвращать все три параметра.
Ваш метод никогда не пройдет мимо первого if -block:
if (self.quality > obj.quality)
return NSOrderedAscending;
else
return NSOrderedDescending; //<== returns for both self.quality > obj.quality AND self.quality == obj.quality
Поскольку сравнение должно иметь один из трех результатов, но вы проверяете только один, вы всегда будете возвращаться из метода в этом блоке if. Ни одна другая логика никогда не будет использована.
Вам потребуется вложить блоки if, чтобы получить логику фильтрации. Проверьте, являются ли они больше и меньше, и вернитесь, но если они одинаковые, переходите к следующему тесту. Повторите по мере необходимости.
- (NSComparisonResult) compare: (MyObject *) obj {
if (self.quality > obj.quality)
return NSOrderedAscending;
else if (self.quality < obj.quality)
return NSOrderedDescending;
else {
if (self.quantity > obj.quantity)
return NSOrderedAscending;
else if (self.quantity < obj.quantity)
return NSOrderedDescending;
else {
... and so on
}
}
Я думаю, что у каждого атрибута сравнения должен быть свой метод. Затем вы можете объединить их в одно грандиозное сравнение, если вам нужно всесторонне сравнить два объекта класса.
В данном случае похоже, что метод betterThan:
- это фактическое сравнение классов.