Ответ 1
В Objective-C нет стандартного протокола для сравнения, например интерфейса Comparable<T>
в Java, но некоторые классы из фреймворческой структуры определяют метод compare:
.
NSString
и NSNumber
приведены примеры.
Если вы хотите предоставить свой собственный метод сравнения для пользовательского класса, я предлагаю вам придерживаться соглашений и предоставлять метод со следующей подписью
- (NSComparisonResult)compare:(MyClass *)object;
NSComparisonResult
- это перечисление, определенное следующим образом
enum {
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
NSOrderedAscending
означает, что левый операнд меньше правой (и из этого вы получаете остальные).
Примечание
Стоит подчеркнуть, что Objective-C и тесно связанная Foundation Framework построены на условностях. Это не просто идиоматический способ написания, поскольку иногда реализация зависит от них. Например, если вы создадите NSSortDescriptor
без указания настраиваемого селектора, реализация по умолчанию вызовет compare:
для объектов. (пример шляпы Дэвиду Ронквивисту для примера)
Другим примечательным примером является соглашение об именах для методов. Ожидается, что методы экземпляров, начинающиеся с init
, возвращают объект с сохранением +1. Это было такое сильное соглашение, что с появлением ARC он был формализован и встроен в компилятор.
Чтобы обернуть это: соглашения всегда важны. В Objective-C иногда они являются фундаментальными.