2012-05-03 2 views
0

примечание от земли N00B снова. Я читал много о сортировке массивов - хотел попробовать метод блока, но не обернул вокруг него голову. Вместо этого я выбрал метод дескрипторов. Я прочел это Sort NSArray of custom objects by their NSDate properties и это How to sort an NSMutableArray with custom objects in it? среди ульд и согдийцев других. В моем коде я это сделал:Сортировка NSArray по двум свойствам - int и дата

NSString *lastHighScore = @"_highScore"; 
NSString *dateScoreCreated = @"_dateCreated"; 
NSSortDescriptor *highScoreDescriptor = [[[NSSortDescriptor alloc] 
    initWithKey:lastHighScore           
    ascending:NO           
    selector:@selector(localizedCaseInsensitiveCompare:)] autorelease]; 

NSSortDescriptor *dateScoreCreatedDescriptor = [[[NSSortDescriptor alloc] 
             initWithKey:dateScoreCreated 
             ascending:NO 
    selector:@selector(localizedCaseInsensitiveCompare:)] autorelease]; 
NSArray *descriptors = [NSArray arrayWithObjects:highScoreDescriptor, 
dateScoreCreatedDescriptor, nil]; 

NSArray *sortedArray = [[[FlipHighScoreStore sharedStore] allHighScores] sortedArrayUsingDescriptors:descriptors]; 

К сожалению, я получаю сообщение об ошибке, чтобы начать с - инициализатором элемент не время компиляции элемента. Я посмотрел на это и попробовал установить NSSortDescriptor *highScoreDescriptor = nil, но потом я получаю предупреждение о том, что highScoreDescriptor «Type Specifier Missing, по умолчанию int», который в этом случае в порядке, но не так хорошо для объекта Date в следующем дескрипторе. (Оказывается, у меня также появляется ошибка, говоря, что я переопределяю highSoreDescriptor другим типом.)

Кроме того, есть ли какой-нибудь список доступных селекторов? Я сомневаюсь, что localizedCaseInsensitiveCompare: - это то, что я хочу использовать, поскольку первое свойство «_highScore» - это int, а второе «_dateCreated» - это дата. Я где-то читал, что значение по умолчанию «сравнивается», поэтому я могу просто поставить «compare:»? (Найдено один ответ, я думаю, - я могу использовать (intValue) для первого дескриптора:

selector:@selector(intValue)] autorelease]; 

Больше чтение заставляет меня думать, что я могу избавиться от линии селекторной полностью на дату сортировки, что правильно.?

Наконец, если я скажу ascending:NO, что так же, как нисходящий? Я бы предположил, что это, но никто не знает, с программированием, делает один?

ли завернуть я весь этот код в своем собственном методе? Или я могу (до тех пор, позже) просто выложить его в код, где я выкладываю стол?

Этот проект не является ARC.

ответ

1

Чтобы ответить на мой собственный вопрос, с небольшой помощью от друга, я в основном делал две вещи неправильно. Во-первых, я писал код вне метода - вот почему я получал все ошибки об элементах инициализации. Наверное, я очень устал, когда добавлял это.

Что касается фактической сортировки, я удалил опцию выбора из описания дескриптора и фактически произошло сортировка!

И, наконец, да, ascending:NO равен нисходящей.

Последний бит, придется подождать, пока я не смогу решить проблему рефакторинга приложения.

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