Написание сравнения: метод в Objective-C - PullRequest
1 голос
/ 27 июня 2011

Я видел этот пост: Как отсортировать NSMutableArray объектов по члену его класса, который является int или float

И имел что-то подобное, но я не былуверен, как все это работает и надеялся на какое-то руководство.У меня есть объекты Array of Marker, которые имеют тип ivar, который принимает значения 0, 1, 2. Я хочу иметь флажок, который говорит, что заказывать по, 0, 1 или 2.

Я начал с попытки сделать что-то похожее в моем собственном методе:

- (NSComparisonResult)Type:(id)otherObject {
    if ([self Type] > [otherObject Type]) {
        return NSOrderedAscending;
    }
    else if ([self Type] < [otherObject Type]) {
        return NSOrderedDescending;
    }
    else {
        return NSOrderedSame;
    }
}

В моем файле .h:

NSInteger _type; 
@property NSInteger Type;

Я получил два предупреждения: Упорядоченное сравнение между указателем и целым числом('id' и NSInteger ') Метод - Тип не найден (тип возвращаемого значения по умолчанию равен' id ')

Не думаю, что я понимаю, что происходит, когда вы вызываете метод сортировки.Спасибо.

Ответы [ 2 ]

5 голосов
/ 28 июня 2011

Что произойдет, если вы явно указали, что тип ввода - 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 будет тем экземпляром этого класса.

0 голосов
/ 27 июня 2011

Похоже, вы определили Type как ivar, а не как свойство, поэтому он не будет виден в otherObject.Выставьте его как свойство, и ваше сравнение должно сработать.

...