Что произойдет, если вы явно указали, что тип ввода - YourObjectType *
(или как называется ваш объект), а не id
? Чтобы быть в полной безопасности, вы должны проверить тип входящего объекта в любом случае (так как он может вообще не отвечать на «Тип» или может возвращать что-то еще с тем же селектором), так что в итоге вы получите:
- (NSComparisonResult)Type:(YourObjectType *)otherObject {
if(![otherObject isKindOfClass:[YourObjectType class]]) return NSOrderedSame;
if ([self Type] > [otherObject Type]) {
return NSOrderedAscending;
}
else if ([self Type] < [otherObject Type]) {
return NSOrderedDescending;
}
else {
return NSOrderedSame;
}
}
Я в основном делаю то же предположение, что и с высоким содержанием кофеина, что компилятор не может правильно определить тип возвращаемого значения «Тип», но я предполагаю, что это из-за неправильного прогноза компилятора о входящем объекте.
Чтобы объяснить весь процесс:
Когда вы запрашиваете NSArray для sortUsingSelector, он применяет некоторый алгоритм сортировки, который требует, чтобы он мог сравнивать любые два объекта в нем. Когда ему нужно сравнить два объекта, он отправит предоставленный вами селектор, а затем будет использовать результат, который вы вернете - так, с помощью Ascending / Descending вы указываете порядок, в котором эти два объекта будут отображаться при правильной сортировке.
Например, если у вас есть NSArray, заполненный объектами типа SillyObjectType, и вы ввели sortUsingSelector:@selector(compare:)
, тогда NSArray будет применять какой-то неуказанный алгоритм сортировки, который включает отправку селектора compare:
к экземплярам SillyObjectType. Каждый SillyObjectType спрашивается «должны ли вы прийти до, после или на равном месте с этим другим объектом?». Он отвечает NSOrderedAscending, Descending или Same.
Это то место, где динамическая диспетчеризация ObjC дает немного другой способ написания вещи, чем вы бы использовали, например, в. C ++. Селектор будет отправлен объектам в массиве, поэтому вы должны реализовать его на этих объектах. В каждом случае применяются нормальные правила, поэтому self
будет тем экземпляром этого класса.