Как отсортировать объект модели по объекту в словаре?

У меня есть объект модели, который расширяется от NSObject, называемого столбцом. Столбец имеет два поля, свойства и данные. Properties — это NSDictionary, в котором хранятся произвольные пары ключ/значение, а данные — это массив.

Столбцы входят в массивы, и мне нужно отсортировать их по значению, которое, как я знаю, всегда будет в свойствах, значение с ключом ordinal_position.

Я использую следующий код для сортировки, но он всегда терпит неудачу, потому что в объекте модели нет "ordinal_position", только в свойствах объекта модели:

NSArray *unsortedArray = [resultStore allValues];
NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"ordinal_position" ascending:YES] autorelease];

NSArray *sortedArray = [unsortedArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

Как я могу указать NSSortDescriptor искать свойство в словаре в объекте модели?


person ruipacheco    schedule 06.01.2010    source источник
comment
«У меня есть объект модели, который расширяется от NSObject и называется столбцом. Столбец имеет два поля, свойства и данные. Properties — это NSDictionary, в котором хранятся произвольные пары ключ/значение, а данные — это массив». Есть ли причина для этого? Это полностью противоположно тому, как ориентирован Cocoa.   -  person Peter Hosey    schedule 06.01.2010


Ответы (2)


Вы должны определить свой собственный селектор, который возвращает NSComparisonResult и реализовать его:

- (NSComparisonResult)compareByProperty:(Column *)aColumn {
    id thisValue = [self valueForKey:@"ordinal_position"];
    id otherValue = [self valueForKey:@"ordinal_position"];

    return [thisValue compare:otherValue]; // Replace to suit your logic
}

Затем используйте метод NSArray sortedArrayUsingSelector::

NSArray *sortedArray = [unsortedArray sortedArrayUsingSelector:@selector(compareByProperty:)];

Обратите внимание, что ваш метод сравнения должен существовать в вашем объекте модели, а не в классе, из которого вы его вызываете - идиома состоит в том, что вы сравниваете некоторый данный объект модели (self) с другим объектом модели (aColumn) внутри первого объекта .

person Tim    schedule 06.01.2010

Используйте ключевой путь:

@"myDictionary.ordinal_position"

person Corey Floyd    schedule 06.01.2010