Сортировка с помощью sortedArrayUsingDescriptors и ключевых путей

#objective-c #cocoa #sorting #key-value-observing #nssortdescriptor

#objective-c #cocoa #сортировка #наблюдение за ключом-значением #nssortdescriptor

Вопрос:

У меня есть неупорядоченный массив с экземплярами следующего класса:

 @interface Place : NSObject {

}

@property (nonatomic, copy) NSString *country;
@property (nonatomic, copy) NSString *city;
@property (nonatomic, retain) NSURL   *imageURL;


-(id) initWithCountry: (NSString *) aCountry city: (NSString *) aCity imageUrl: (NSURL *) aUrl;


@end
  

и я пытаюсь отсортировать это с помощью sortedArrayUsingDescriptors по странам и городам. В документах для NSSortDescriptor говорится, что аргумент initWithKey: является путем к ключу.

Однако, если я попытаюсь использовать NSortDescriptor, такой как:

 NSSortDescriptor *country = [[[NSSortDescriptor alloc] initWithKey:@"country.city" ascending:YES]autorelease];
  

Я получаю сообщение об ошибке:

 NSMutableSet *bag = [[[NSMutableSet alloc] init] autorelease];
[bag addObject:[[Place alloc] initWithCountry:@"USA" 
                                         city:@"Springfield" 
                                     imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]];
[bag addObject:[[Place alloc] initWithCountry:@"Afghanistan" 
                                         city:@"Tora Bora" 
                                     imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]];
[bag addObject:[[Place alloc] initWithCountry:@"USA" 
                                         city:@"Chicago" 
                                     imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]];

[bag addObject:[[Place alloc] initWithCountry:@"USA" 
                                         city:@"Chicago" 
                                     imageUrl:[NSURL URLWithString:@"http://www.google.com"]]];


NSSortDescriptor *sort = [[[NSSortDescriptor alloc] initWithKey:@"country.city" ascending:YES]autorelease];
NSArray *sorted = [bag sortedArrayUsingDescriptors:[NSArray arrayWithObjects: sort, nil]];
  

* Завершение работы приложения из-за неперехваченного исключения ‘NSUnknownKeyException’,
причина: ‘[<NSCFString 0x6ae8>
valueForUndefinedKey:]: этот класс является
не соответствует кодированию значений ключа для
ключевой город.’

Могу ли я использовать путь к ключу или нет? Что я делаю не так?

Комментарии:

1. Пожалуйста, обратите внимание, что NS(Mutable)Set это не пакет. Если вам нужна настоящая сумка, то есть коллекция, куда вы можете поместить более одного каждого элемента, используйте NSCountedSet , которая всегда изменчива.

Ответ №1:

Возможно, вы захотите использовать это:

 NSSortDescriptor *country = [[[NSSortDescriptor alloc] initWithKey:@"country" ascending:YES]autorelease];
NSSortDescriptor *city = [[[NSSortDescriptor alloc] initWithKey:@"city" ascending:YES]autorelease];
NSArray *sorted = [bag sortedArrayUsingDescriptors:[NSArray arrayWithObjects: country, city, nil]];
  

Массив, который передается sortedArrayUsingDescriptors: , определяет приоритеты ключа сортировки. Дескрипторы сортировки предоставляют ключевые пути для сравнения (и требуемый порядок: по возрастанию / убыванию).

Дескриптор сортировки «country.city» запросит у каждого места его страну, а затем в качестве возвращаемой страны (которая является NSString) — его город. И мы все знаем, что NSString не соответствует кодированию значений для ключевого города 😉

Вам понадобился бы дескриптор сортировки, "country.city" если бы у ваших Place экземпляров было свойство country , у которых самих было свойство city .